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