在利用爬虫爬取页面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