04 python38的scrapy和selenium处理异步加载的动态html页面

这篇具有很好参考价值的文章主要介绍了04 python38的scrapy和selenium处理异步加载的动态html页面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 异步加载的html页面,页面源代码数据xpath是找不到的

1.0 网站分析

#淘宝搜索页网址:https://s.taobao.com/search?q=手机
#搜索列表页分析:
第一页:https://s.taobao.com/search?q=手机
第二页:都是ajax请求生成
最后一页:都是ajax请求生成

请求方式get
返回数据为html

1.1 创建项目

scrapy startproject taobaoSpider 
cd ssqSpider
scrapy genspider taobao taobao.com

1.2 创建爬虫

scrapy genspider taobao "taobao.com"

1.3 添加工具函数模块utils.py


from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.common import exceptions

import json

def create_chrome_driver(headless=False):
    options=webdriver.ChromeOptions()
    if headless:
        options.add_argument('--headless')

    #去掉chrome正在受到测试软件的控制的提示条
    options.add_experimental_option('excludeSwitches',['enable-automation'])
    options.add_experimental_option('useAutomationExtension',False)
    options.add_argument("--disable-blink-features=AutomationControlled")
    
    # 定义chrome驱动去地址
    service =  Service('chromedriver.exe')
    # service=Service(r'E:\项目区\项目2023-编程项目教程\ssq_caipiao_pachong\taobaoSpider\chromedriver.exe')

    browser=webdriver.Chrome(service=service,options=options)
    #反爬,修改为navigator.webdriver=undefined
    browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
        'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})'})

    return browser

def add_cookies(browser,cookie_file):
    with open(cookie_file,'r') as file:
        cookies_list=json.load(file)
        for cookie_dict in cookies_list:
            if cookie_dict['secure']:
                try:
                    browser.add_cookie(cookie_dict)
                except exceptions.InvalidCookieDomainException as e:
                    print(e.msg)
                
def test():
    print("ggggggg")

1.4 测试淘宝页面反爬机制

1.4.1 taobao_login.py模拟登陆生成cookies.json

from utils import create_chrome_driver,add_cookies,test
import json
import time
from selenium.webdriver.common.by import By

browser=create_chrome_driver()
time.sleep(1)

# browser.get('https://taobao.com')
# time.sleep(1)


# el=browser.find_element(by=By.XPATH,value='//*[@id="q"]')
# el.send_keys('手机')
# time.sleep(1)

# el=browser.find_element(by=By.XPATH,value='//*[@id="J_TSearchForm"]/div[1]/button')
# el.click()
# time.sleep(1)
# # #滚动到底部
# # js="window.scrollTo(0,450);"
# # driver.execute_script(js)
# # sleep(3)
# # 或者
# js = "var q=document.documentElement.scrollTop=4514"
# browser.execute_script(js)
# time.sleep(1)
# # 点击下一页
# el=browser.find_element(by=By.XPATH,value='//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[2]')
# el.click()
# time.sleep(1)

# browser.get('https://s.taobao.com/search?commend=all&ie=utf8&initiative_id=tbindexz_20170306&q=%E6%89%8B%E6%9C%BA&search_type=item&sourceId=tb.index&spm=a21bo.jianhua.201856-taobao-item.2&ssid=s5-e')
#进入登陆页面
browser.get('https://login.taobao.com/member/login.jhtml')
time.sleep(1)

el=browser.find_element(by=By.XPATH,value='//*[@id="fm-login-id"]')
el.send_keys('123@qq.com')

el=browser.find_element(by=By.XPATH,value='//*[@id="fm-login-password"]')
el.send_keys('123456')

el=browser.find_element(by=By.XPATH,value='//*[@id="login-form"]/div[4]/button')
el.click()
time.sleep(6)
#保存cookie
with open('taobao_cookie.json','w') as file:
    json.dump(browser.get_cookies(), file)
time.sleep(1)
# print(browser.page_source)

browser.get('https://s.taobao.com/search?q=手机')
time.sleep(1)

time.sleep(600)

1.4.2 taobao_login_after.py淘宝登陆后测试

from utils import create_chrome_driver,add_cookies,test
import json
import time
from selenium.webdriver.common.by import By

browser=create_chrome_driver()
time.sleep(1)

# 先访问下页面再设置cookie,否则报错
browser.get('https://taobao.com')
time.sleep(1)
add_cookies(browser,'taobao_cookie.json')
time.sleep(1)

browser.get('https://s.taobao.com/search?q=手机')
time.sleep(1)

time.sleep(600)

1.5 修改下载中间件

from scrapy import signals
from scrapy.http import HtmlResponse
import time

# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter
from utils import create_chrome_driver,add_cookies
from taobaoSpider.spiders.taobao import TaobaoSpider

class TaobaospiderDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def __init__(self):
        self.browser=create_chrome_driver()
        self.browser.get('https://www.taobao.com')
        add_cookies(self.browser, 'taobao_cookie.json')

    def __del__(self):
        self.browser.close()
        pass

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        if not isinstance(spider, TaobaoSpider):
            return None
        else:
            self.browser.get(request.url)
            time.sleep(2)
            # # #滚动到底部
            # js="window.scrollTo(0,450);"
            # self.browser.execute_script(js)
            # sleep(3)
            # # 或者
            # js = "var q=document.documentElement.scrollTop=4514"
            # self.browser.execute_script(js)
            # time.sleep(2)
            # 慢慢滚动
            for i in range(45,4514,400):
                js = f"var q=document.documentElement.scrollTop={i}"
                self.browser.execute_script(js)
                time.sleep(0.5)

            # # 点击下一页
            # el=browser.find_element(by=By.XPATH,value='//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[2]')
            # el.click()
            # time.sleep(1)
            return HtmlResponse(url=request.url,body=self.browser.page_source,
                                request=request,encoding='utf-8')

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)

修改下载中间件配置文章来源地址https://www.toymoban.com/news/detail-736105.html

DOWNLOADER_MIDDLEWARES = {
   "taobaoSpider.middlewares.TaobaospiderDownloaderMiddleware": 543,
}

1.6 修改爬虫代码

1.6.1 添加数据模型

import scrapy

class TaobaospiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    pass

1.6.2 修改爬虫代码

import scrapy
from scrapy import Request
from scrapy.http import HtmlResponse
from taobaoSpider.items import TaobaospiderItem


class TaobaoSpider(scrapy.Spider):
    name = "taobao"
    allowed_domains = ["taobao.com"]
    # start_urls = ["https://taobao.com"]
    def start_requests(self):
        keywords=['手机','笔记本电脑','键鼠套装']
        keywords=['手机']
        for keyword in keywords:
            for page in range(1):
                url=f'https://s.taobao.com/search?q={keyword}&s={page*48}'
                yield Request(url)

    def parse(self, response:HtmlResponse):
        # print(response.text)
        cssitem_list=response.xpath('//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[3]/div/div')
        # print(len(cssitem_list))
        for cssitem in cssitem_list:
            item=TaobaospiderItem()
            item['title']=cssitem.xpath('./a/div/div[1]/div[2]/div/span/text()').extract()
            yield item
        pass

1.6.3 测试运行爬虫

scrapy crawl taobao  #正式运行
或者
scrapy crawl taobao -o taobao.csv 

到了这里,关于04 python38的scrapy和selenium处理异步加载的动态html页面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用Scrapy和Selenium爬取动态数据

    文章参考千锋教育大佬的课程: https://www.bilibili.com/video/BV1QY411F7Vt?p=1vd_source=5f425e0074a7f92921f53ab87712357b ,多谢大佬的课程   因为TB网的搜索功能需要登录之后才能使用,所以我们要通过程序去控制浏览器实现登录功能,然后再获取登录之后的Cookie.   首先创建一个Chrome浏览

    2024年02月02日
    浏览(42)
  • Scrapy爬虫框架集成Selenium来解析动态网页

    当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资

    2024年02月15日
    浏览(51)
  • requests或selenium获取网页内容不全问题(非异步加载)

    最近用python做脚本的时候,发现了一个问题,就是获取的网页并不全。可能原因之一是页面内容过大,无法加载全部到内存中 下面的解决方法只针对静态加载页面(有的网页是动态加载数据,需要查看对应的js请求或者用selenium来获取就好)。 解决方法为放入文件里,再读取

    2024年01月25日
    浏览(46)
  • python爬虫selenium+scrapy常用功能笔记

    访问网址可以看到直观结果 https://bot.sannysoft.com/ 获取页面dom 页面元素获取 元素点击 frame跳转 获取cookie 给请求添加cookie 点击 上传文件 退出页面 多摘自之前文档 https://blog.csdn.net/weixin_43521165/article/details/111905800 创建项目 scrapy startproject 爬虫项目名字 # 例如 scrapy startproject f

    2023年04月20日
    浏览(56)
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

    Selenium是一个模拟浏览器浏览网页的工具,主要用于测试网站的自动化测试工具。 Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取或自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器。 注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目

    2024年01月18日
    浏览(60)
  • python爬虫 scrapy+selenium+webdriver实现鼠标滑动破解阿里云盾快验证

    在爬取jianshu文章的时候发现,jianshu竟然买了阿里云的盾块验证!!!很是头疼,虽然说没有其他图片匹配的那么麻烦,但是阿里云的人机验证和算法真的是顶尖的,查阅了多个资料最后没办法,才实现用webdriver模拟鼠标去通过验证 首先我们需要安装webdriver驱动和Google Chrom

    2024年02月03日
    浏览(58)
  • 【Python从入门到进阶】38、selenium关于Chrome handless的基本使用

    接上篇《37、selenium关于phantomjs的基本使用》 上一篇我们介绍了有关phantomjs的相关知识,但由于selenium已经放弃PhantomJS,本篇我们来学习Chrome的无头版浏览器Chrome Handless的使用。 一、Chrome Headless简介 Chrome Headless是一个无界面的浏览器环境,它是Google Chrome浏览器在59版本之后新

    2024年02月06日
    浏览(48)
  • Python爬虫进阶:使用Scrapy库进行数据提取和处理

    在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。 在Scrapy中,提取数据主要通过Selectors来完成。Selectors基于XPath或CSS表达式的查询语言来选取HTML文档中的元素。你

    2024年02月09日
    浏览(47)
  • python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息

    接着上一篇的笔记,Scrapy爬取普通无反爬、静态页面的网页时可以顺利爬取我们要的信息。但是大部分情况下我们要的数据所在的网页它是动态加载出来的(ajax请求后传回前端页面渲染、js调用function等)。这种情况下需要使用selenium进行模拟人工操作浏览器行为,实现自动化

    2024年02月04日
    浏览(73)
  • python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取沪深A股股票行情

    上篇记录了Scrapy搭配selenium的使用方法,有了基本的了解后我们可以将这项技术落实到实际需求中。目前很多股票网站的行情信息都是动态数据,我们可以用Scrapy+selenium对股票进行实时采集并持久化,再进行数据分析、邮件通知等操作。 详情请看上篇笔记 items middlewares setti

    2024年02月04日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包