我最近在學習python爬蟲,然后正好碰上數據庫課設,我就選了一個連鎖葯店的,所以就把網上的葯品信息爬取了下來。
1,首先分析網頁
2,我想要的是評論數比較多的,畢竟好東西大概是買的人多才好。然后你會發現它的url地址是有規律的里面的j1是指第一頁,j2第二頁,這樣構建一個url_list。
1 url_list = 'https://www.111.com.cn/categories/953710-a0-b0-c31-d0-e0-f0-g0-h0-i0-j%s.html'#然后循環獲取響應 2 3 for i in range(1, 30): 4 5 response = requests.get(url_list % i, headers=headers)
3,然后就可以進行數據的提取,我是利用Chrome的xpath插件,不過一定要注意有時候你復制的xpath不一定准確需要自己分析
我這里是演示提取價格,定位到價格選中后在Element里找到后點鼠標右鍵找到copy然后選擇copy xpath,上面那個黑框就是xpath插件
4,連接數據庫,我的數據庫是mysql的
連接數據庫的代碼一般是這樣
#!/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb # 打開數據庫連接 db = MySQLdb.connect("localhost", "root", "123", "lianxi", charset='utf8' ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # 如果數據表已經存在使用 execute() 方法刪除表。 cursor.execute("DROP TABLE IF EXISTS EMPLOYEE") # 創建數據表SQL語句 sql = """CREATE TABLE EMPLOYEE ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )DEFAULT CHARSET =utf8""" cursor.execute(sql) #!/usr/bin/python # -*- coding: UTF-8 -*- # 打開數據庫連接 db = MySQLdb.connect("localhost", "root", "123", "lianxi", charset='utf8' ) # 使用cursor()方法獲取操作游標 cursor = db.cursor() # SQL 插入語句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('王', 'Mohan', 20, 'M', 2000)""" try: # 執行sql語句 cursor.execute(sql) # 提交到數據庫執行 db.commit() except: # Rollback in case there is any error db.rollback() print("a") # 關閉數據庫連接 db.close()
這個我是參照菜鳥教程的https://www.runoob.com/python/python-mysql.html
5,最后把源碼附上,還有數據庫里爬取的數據
import requests from lxml import etree import pymysql def get_text(text): if text: return text[0] return '' def create(): db = pymysql.connect("localhost", "root", "123", "lianxi",charset='utf8') # 連接數據庫 cursor = db.cursor() cursor.execute("DROP TABLE IF EXISTS a") sql = """CREATE TABLE a ( ID INT PRIMARY KEY AUTO_INCREMENT, 葯物名字 char (255), 葯物價格 char (7), 葯物網址 CHAR(255), 葯店ID char (6) )DEFAULT CHARSET =utf8""" cursor.execute(sql) db.close() db = pymysql.connect("localhost", "root", "123", "lianxi",charset='utf8') cursor = db.cursor() url_list = 'https://www.111.com.cn/categories/953710-a0-b0-c31-d0-e0-f0-g0-h0-i0-j%s.html' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36"} for i in range(1, 30): response = requests.get(url_list % i, headers=headers) re=response.text content = etree.HTML(re) li_list = content.xpath('//ul[@id="itemSearchList"]/li') ##單價,描述,詳情頁鏈接 for li in li_list: # print(li) price = get_text(li.xpath( './/div[@isrecom="0"]/p[1]/textarea/span/text()|.//div[@isrecom="0"]/p[1]/span/text()|.//div[@isrecom="0"]/p[1]/span/u/text()')).strip() name = li.xpath('.//div[@isrecom="0"]/p[2]/a/text()')[1].strip() url = get_text(li.xpath('.//div[@class="itemSearchResultCon"]/a[1]/@href')).strip() infos = [] item = {} item['價格'] = price item['名字'] = name item['地址'] = 'https:' + url infos.append(item) print(item['價格']) print(item['地址']) print(item['名字']) a=1 insert_sql = 'INSERT INTO a (葯物價格,葯物名字,葯物網址,葯店ID) VALUES (%s,%s,%s,%s)' cursor.execute(insert_sql, (item['價格'],item['名字'] ,item['地址'],a)) try: db.commit() print('插入數據成功') except: db.rollback() print("插入數據失敗") db.close() if __name__ == '__main__': create()
總結:第一次寫博客,寫的很粗糙,代碼部分可能不是寫的很美,畢竟我也是個小白,希望大家多多留言,提提意見,一同進步。