前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Scrapy框架爬取微医H5数据

使用Scrapy框架爬取微医H5数据

作者头像
zx钟
发布2021-11-04 16:00:18
4690
发布2021-11-04 16:00:18
举报
文章被收录于专栏:测试游记

环境搭建

安装

安装python爬虫框架scrapy

代码语言:javascript
复制
$ pip install scrapy

由于页面是动态渲染的,所以采用打开浏览器的方式进行数据爬取,所以需要安装selenium

代码语言:javascript
复制
$ pip install selenium

脚手架搭建

  1. 创建项目命令:scrapy startproject “项目名”
  2. 创建爬虫文件命令:scrapy genspider “爬虫名” “爬虫范围”
  3. 启动一个爬虫:scrapy crawl “爬虫名字”
代码语言:javascript
复制
$ scrapy startproject wyspider
$ scrapy genspider home guahao.com
$ scrapy crawl home

scrapy框架

  1. Scrapy Engine(引擎): 负责SpiderItemPipelineDownloaderScheduler中间的通讯,信号、数据传递等。
  2. Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
  3. Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
  4. Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
  5. Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
  6. Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
  7. Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

scrapy框架流程

start_urls快速走了一遍流程再开始parse()

  1. 引擎拿到request请求发送给调度器整理入列
  2. 调度器返回request请求给引擎
  3. 引擎发送request请求给下载器
  4. 下载器前往互联网进行下载response返回给引擎
  5. 引擎把response返回给爬虫
  6. 爬虫返回items或者request给引擎
  7. items返回给管道,request进行下一轮循环

中间件

编写编写

这次的目标暂定为打开一个页面后截图进行保存,所以我们在中间件中操作截图

代码语言:javascript
复制
class ChromeSpiderMiddleware(object):

    def save_screenshot(self, spider):
        file_name = f'{spider.driver.title}_{int(time.time() * 1000)}.png'
        spider.driver.save_screenshot(f'{LOG_PATH}/{file_name}')
        logger.info(f'爬取的地址为:{spider.driver.current_url},页面名称为:{spider.driver.title},截图名称为:{file_name}')


    def process_request(self, request, spider):
        spider.driver.get(request.url)
        time.sleep(0.5)
        self.save_screenshot(spider)
        html = spider.driver.page_source
        return scrapy.http.HtmlResponse(url=request.url, body=html.encode('utf-8'), encoding='utf-8',
                                        request=request)

开启中间件

settings.py中修改DOWNLOADER_MIDDLEWARES

代码语言:javascript
复制
DOWNLOADER_MIDDLEWARES = {
   'wyspider.middlewares.ChromeSpiderMiddleware': 543,
}

编写爬虫

设置爬取范围与初始爬取地址

  • 爬取范围:allowed_domains
  • 初始爬取地址:base_url
代码语言:javascript
复制
class HomeSpider(scrapy.Spider):
    name = 'home'
    allowed_domains = ['guahao.com']
    base_url = 'https://wy.guahao.com'
    start_urls = [
        base_url
    ]

打开浏览器

在最开始爬取的时候,需要先打开浏览器,建议采用无头浏览器

代码语言:javascript
复制
def __init__(self):
    super(HomeSpider, self).__init__(name=self.name)
    chrome_option = Options()
    chrome_option.add_experimental_option('mobileEmulation', {'deviceName': 'iPhone X'})
    chrome_option.add_experimental_option('w3c', False)
    desired_capabilities = DesiredCapabilities.CHROME
    desired_capabilities["pageLoadStrategy"] = "eager"
    chrome_option.add_argument('--headless')
    chrome_option.add_argument('--disable-gpu')
    chrome_option.add_argument('--no-sandbox')
    self.driver = webdriver.Chrome(executable_path=f'{TOOL_PATH}/chromedriver',
                                   chrome_options=chrome_option,
                                   desired_capabilities=desired_capabilities)

爬虫主体

找到页面上a标签的链接

然后与基础url进行拼接

打开新的页面后递归调用爬虫函数

继续在新打开的页面中找到a标签地址

直到没有a标签或者超出运行爬取的域名外结束爬虫

代码语言:javascript
复制
def parse(self, response):
    url_list = response.xpath('//a/@href').extract()
    url_list = [i.strip() for i in url_list if 'javascript:' not in i]
    logger.info(f'爬取的地址列表为:{url_list}')
    for url in url_list:
        if url.startswith("http"):
            link = url
        else:
            link = self.base_url + url
        logger.info(f'爬取的地址为:{link}')
        yield scrapy.Request(url=link, callback=self.parse)

执行日志

下面是最开始的第一条爬虫数据,打开了首页,然后再首页找到了n个链接,依次进入链接后进行截图,并重复开始的流程

代码语言:javascript
复制
2021-11-01 10:25:04,444-INFO-python:爬取的地址为:https://wy.guahao.com/,页面名称为:微医(挂号网)-互联网医院在线诊疗平台,截图名称为:微医(挂号网)-互联网医院在线诊疗平台_1635733502798.png
2021-11-01 10:25:09,005-INFO-python:爬取的地址列表为:['/home/search', 'https://hmall.guahao.com/activity/42d771de31734906b73a8437e0e124b7', 'https://vip.guahao.com', 'https://hd.guahao.com/u/29691?channelNumber=C0039N2489K', 'https://hd.guahao.com/u/28844?channelNumber=C0039N2489K', 'https://hd.guahao.com/u/29597?_channel=hdyx026a&huiyuanzhuanshu', 'https://hd.guahao.com/u/28963?_channel=hdyx005a', 'https://weex.guahao.com/weex/alias/portal/special-disease/more', 'https://app.wy.guahao.com/medical-examination?app_disable_navbar=1&frompage=home', 'https://hd.guahao.com/u/28160?cp=fjjwyapp', 'https://industry.guahao.com/as?source_id=51111', 'https://industry.guahao.com/activity/a5666e96aa7c4e4d9f34f09a25c79b58?source_id=40948&_cp=my713', 'https://hd.guahao.com/u/28475', 'https://wy.guahao.com/ums/cdm?diseaseCode=39816&_cp=tnbapp', 'https://hd.guahao.com/u/28822?gytx1=', 'https://industry-consume.guahao.com/activity/09f0fe82ab9f45928e6b78a5d17ad85c?trace=appzbzk', 'https://wy.guahao.com/home/tumor-hospital', 'https://www.wjx.cn/vj/tjAgy5b.aspx', 'https://doctorbridge.guahao.com/app/list', 'https://hmall.guahao.com/index', 'https://hmall.guahao.com/opt/item/492747083989835776', 'https://hmall.guahao.com/opt/item/541605568869101568', 'https://hmall.guahao.com/opt/item/528150867959934976', 'https://hmall.guahao.com/opt/item/492765816078655488', 'https://hmall.guahao.com/opt/item/515100617632444416', 'https://hmall.guahao.com/opt/item/497746177573322752', '/', '/consult/doctor', '/guide/disease', '/my/follow/expertlist', '/navigation', '/my/profile']
2021-11-01 10:25:09,006-INFO-python:爬取的地址为:https://wy.guahao.com/home/search
2021-11-01 10:25:10,285-INFO-python:爬取的地址为:https://wy.guahao.com/home/search,页面名称为:搜索,截图名称为:搜索_1635733510041.png
2021-11-01 10:25:12,468-INFO-python:爬取的地址为:https://wy.guahao.com/consult/portal,页面名称为:在线问诊,截图名称为:在线问诊_1635733512095.png
2021-11-01 10:25:12,500-INFO-python:爬取的地址为:https://hmall.guahao.com/activity/42d771de31734906b73a8437e0e124b7
2021-11-01 10:25:12,500-INFO-python:爬取的地址为:https://vip.guahao.com
2021-11-01 10:25:12,501-INFO-python:爬取的地址为:https://hd.guahao.com/u/29691?channelNumber=C0039N2489K
2021-11-01 10:25:12,501-INFO-python:爬取的地址为:https://hd.guahao.com/u/28844?channelNumber=C0039N2489K
2021-11-01 10:25:12,502-INFO-python:爬取的地址为:https://hd.guahao.com/u/29597?_channel=hdyx026a&huiyuanzhuanshu
2021-11-01 10:25:12,502-INFO-python:爬取的地址为:https://hd.guahao.com/u/28963?_channel=hdyx005a
2021-11-01 10:25:12,503-INFO-python:爬取的地址为:https://weex.guahao.com/weex/alias/portal/special-disease/more
2021-11-01 10:25:12,504-INFO-python:爬取的地址为:https://app.wy.guahao.com/medical-examination?app_disable_navbar=1&frompage=home
2021-11-01 10:25:12,504-INFO-python:爬取的地址为:https://hd.guahao.com/u/28160?cp=fjjwyapp
2021-11-01 10:25:12,505-INFO-python:爬取的地址为:https://industry.guahao.com/as?source_id=51111
2021-11-01 10:25:12,506-INFO-python:爬取的地址为:https://industry.guahao.com/activity/a5666e96aa7c4e4d9f34f09a25c79b58?source_id=40948&_cp=my713
2021-11-01 10:25:12,506-INFO-python:爬取的地址为:https://hd.guahao.com/u/28475
2021-11-01 10:25:12,507-INFO-python:爬取的地址为:https://wy.guahao.com/ums/cdm?diseaseCode=39816&_cp=tnbapp
2021-11-01 10:25:12,507-INFO-python:爬取的地址为:https://hd.guahao.com/u/28822?gytx1=
2021-11-01 10:25:12,508-INFO-python:爬取的地址为:https://industry-consume.guahao.com/activity/09f0fe82ab9f45928e6b78a5d17ad85c?trace=appzbzk
2021-11-01 10:25:12,509-INFO-python:爬取的地址为:https://wy.guahao.com/home/tumor-hospital
2021-11-01 10:25:12,509-INFO-python:爬取的地址为:https://www.wjx.cn/vj/tjAgy5b.aspx
2021-11-01 10:25:12,510-INFO-python:爬取的地址为:https://doctorbridge.guahao.com/app/list

截图

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境搭建
    • 安装
      • 脚手架搭建
      • scrapy框架
      • scrapy框架流程
      • 中间件
        • 编写编写
          • 开启中间件
          • 编写爬虫
            • 设置爬取范围与初始爬取地址
              • 打开浏览器
                • 爬虫主体
                • 执行日志
                相关产品与服务
                消息队列 TDMQ
                消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档