• 爬虫之selenium模拟点击


    在利用爬虫爬取页面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
  • 相关阅读:
    C# 6.0 新特征 Demo
    SmartGit 试用过期
    .net版Git Server --- bonobo
    线程操作若干(复习)
    异步的两种写法: async 与 BeginInvoke
    winform 防止主界面卡死
    wcf 出现 IsContentTypeSupported 错误
    NodeJs 实时压缩 项目js文件
    Excel 公式(细节若干)
    itextSharp 对pdf的每个页面添加footer/header
  • 原文地址:https://www.cnblogs.com/wjohh/p/10514177.html
Copyright © 2020-2023  润新知