在利用爬蟲爬取頁面HTML信息得時候有的當你運用request方法爬取時爬下來得HTML信息和網站信息不相符,這也導致以后得爬去無法進行,這也是反扒機制之一,解決辦法時利用代碼進行模擬網頁點擊,來爬去相應得信息。
注:以下代碼以今日頭條網站為例!
具體代碼如下:
import requests
from lxml import etree
import os
#模擬瀏覽器行為
from selenium import webdriver
from mysqldb import ConnectMysql
import pymysql
class Gevent_spider(object):
def get_html(self,url):
#根據網址為所獲得的HTML文件命名
if url == 'https://www.toutiao.com/ch/news_image/':
file_name = 'toutiao.html'
else:
file_name = 'inner_pear.html'
#定義一個新的變量接收匹配后的值
html_content = ''
#使用os模塊來判斷文件是否存在 如果不存在直接寫文件
if not os.path.exists(file_name):
#利用selenium方法來模擬人點擊瀏覽器行為獲取正式html
browser = webdriver.Chrome()
#get獲取頁面信息
browser.get(url)
#解碼並進行賦值
html = browser.page_source.encode("utf-8").decode()
#設置等待時間 等待模擬器操作完成
time.sleep(5)
#將爬去的HTML寫入文件
with open('./'+file_name,'w',encoding='utf-8') as f:
f.write(html)
#關閉模擬行為
browser.quit()
#對空變量進行賦值
html_content = html
#如果文件存在直接讀取文件中的信息,
else:
with open('./'+ file_name,encoding='utf-8') as f:
contents = f.read()
#對空變量重新復制
html_content = contents
#將爬取的信息傳入解析模板方法
self.xpath_html(html_content)
#定義解析方法
def xpath_html(self,html):
#利用LXML方法解析HTML
html = etree.HTML(html)
#匹配圖片標簽 因為圖片標簽隱藏在不同的層次下 所以匹配兩個
img_list = html.xpath("//div[@class='image-wrap middle left']/img/@src")
img_list1 = html.xpath("//div[@class='image-wrap large']/img/@src")
#遍歷其中一個圖片列表 將其添加到另一個 已保證圖片列表得完整性
for item in img_list1:
img_list.append(item)
#下載圖片
for item in img_list:
#定義下載到得地址
path = "E:/頭條/"
if os.path.exists(path):
filepath = requests.get('http://'+item.replace('//',''))
filepath1 = filepath.content
picname = item.split("/")[-1]
with open(path + "/" + picname+'.jpg',"wb") as f:
f.write(filepath1)
#匹配內頁網址和標題
url_list = html.xpath("//ul[@class='imgList']/li/a/@href")
title_list= html.xpath("//p[@class='des']/text()")
#手動添加url 便利后添加到列表
url_list1 = []
for item in url_list:
item = 'https://www.toutiao.com' + item
url_list1.append(item)
#判斷標題 去除空格
title_list1 = []
for item in title_list:
if item == " ":
pass
else:
title_list1.append(item)
# print(url_list1,"+++++++++",img_list,"+++++++++",title_list1)
# print(len(url_list1),"+++++++++",len(img_list),"+++++++++",len(title_list1))
#將匹配后得數據傳到入庫方法中
self.insert_db(url_list1,title_list1,img_list)
#定義寫成入庫方法
def insert_db(self,url_list1,title_list1,img_list):
#建立數據庫連接
conn = pymysql.connect(host='localhost',user='root',password='mysql',database='mymac',charset='utf8')
#定義游標對象
cursor = conn.cursor()
#入庫操作
for item in range(len(img_list)):
cursor.execute(" insert into `toutiao_spider` values ('%s','%s','%s') " % (url_list1[item],title_list1[item],img_list[item]))
conn.commit()
cursor.close()
conn.close()
#爬取內頁
# def get_inner_data(self,list):
# for item in list:
# # print(item)
# browser = webdriver.Chrome()
# browser.get(item)
# html = browser.page_source.encode("utf-8").decode()
# time.sleep(5)
# browser.quit()
# html = etree.HTML(html)
# title = html.xpath("//div[@class='info-box-inner']/h2/text()")
# print(title)
#端點測試
# exit(-1)
#程序入口
if __name__ == "__main__":
#實例化對象
gevent_spider = Gevent_spider()
#調用方法並傳相應參數
gevent_spider.get_html('https://www.toutiao.com/ch/news_image/')
mysqldb.py 文件具體代碼:
#導包
import pymysql
#定義數據庫公共類
class ConnectMysql(object):
#定義方法連接mysql
def connect_mysql(self):
#建立連接對象
conn = pymysql.connect(host='localhost',user='root',password='mysql',database='mymac',charset='utf8')
return conn
