Python 爬虫—scrapy

scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。

该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了

入门

python 复制代码
import scrapy

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://www.zyte.com/blog/']

    def parse(self, response):
        for title in response.css('.oxy-post-title'):
            # 返回对象
            yield {'title': title.css('::text').get()}

        for next_page in response.css('a.next'):
            # 返回一个连接,爬虫框架会继续请求这个连接,得到响应后再回调 parse 方法
            yield response.follow(next_page, self.parse)

运行

bash 复制代码
scrapy runspider myspider.py

代码中通过 main 方式运行调试

python 复制代码
# _*_ coding: utf-8 _*_
import os, sys, pprint
from scrapy.cmdline import execute


def build_base_config():
    current_dir_path = os.path.dirname(os.path.abspath(__file__))
    # sys.path.append(current_dir_name)  # 入口文件 与模块查找路径、import 相对路径导入有影响
    print('\n当前路径 PATH:', current_dir_path)
    # pprint.pprint(sys.path)
    filepath, file_name = os.path.split(current_dir_path)
    spiders_name = file_name
    spiders_name = "bestbuy_new_ca"
    return current_dir_path, spiders_name

def run_product_review():
    """
    运行产品评论
    """
    current_dir_path, spiders_name = build_base_config()
    # 结果输出到本地 json 文件
    execute(['scrapy', 'crawl', spiders_name + '-products_review',
             f'-o{current_dir_path}/temp/product-review.json',
             '-LDEBUG',
             f'-apath={current_dir_path}/temp/review-links.json',
             '-acollect_exist=1'
             ])


if __name__ == '__main__':
    run_product_review()
    pass

简单说:使用了 scrapy.cmdline 提供的工具,执行的命令和在命令行中的一致,只是这种方式可以在 idea 工具中进行 debug 调试

入门和实际开发的不同之处:

  1. 开发上:
    a.入门:例子相对简单,工程结构也不怎么注重
    b.生产:相对复杂,在核心开发上差不多,也是如何去解析 html 结构,工程结构上为了调度和复用,可能会更复杂一点
  2. 调度平台:
    a.有使用一些开源的调度平台,因为是通用
    b.还有的可能会再开源的调度平台上,再包装一层自己的调度平台,仅用来展示(符合产品经理的设计)

官方对于动态内容的引导

https://docs.scrapy.org/en/latest/topics/dynamic-content.html

个人感觉这里提供的知识点还是非常具有参考价值的,简单总结:

  • 使用 scrapy shell 工具定位数据源

    $ scrapy shell "quotes.toscrape.com/scroll"
    (...)

    view(response)

  • 使用 scrapy fetch 工具获取响应到文件,这类似与查看网页源代码

    scrapy fetch --nolog https://example.com > response.html

  • 复制请求:在浏览器中可以将请求复制为 curl 格式,然后可以使用 form_curl() 来使用

    from scrapy import Request

    request = Request.from_curl(
    "curl 'https://quotes.toscrape.com/api/quotes?page=1' -H 'User-Agent: Mozil"
    "la/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0' -H 'Acce"
    "pt: /' -H 'Accept-Language: ca,en-US;q=0.7,en;q=0.3' --compressed -H 'X"
    "-Requested-With: XMLHttpRequest' -H 'Proxy-Authorization: Basic QFRLLTAzM"
    "zEwZTAxLTk5MWUtNDFiNC1iZWRmLTJjNGI4M2ZiNDBmNDpAVEstMDMzMTBlMDEtOTkxZS00MW"
    "I0LWJlZGYtMmM0YjgzZmI0MGY0' -H 'Connection: keep-alive' -H 'Referer: http"
    "://quotes.toscrape.com/scroll' -H 'Cache-Control: max-age=0'")

  • 解析 JavaScript 代码:html 中有些网站会出现 <script>中间是大段的 json 数据有可能是变量,也有可能是初始化数据之类的</script>,就可以使用

    比如是
    var data = {"field": "value"};

    可以使用如下的方式匹配
    pattern = r'\bvar\s+data\s*=\s*({.?})\s;\s*\n'
    json_data = response.css('script::text').re_first(pattern)
    json.loads(json_data)
    {'field': 'value'}

相关推荐
蒙娜丽宁9 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev10 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子24 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python28 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯38 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼1 小时前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
放飞自我的Coder1 小时前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词
正义的彬彬侠2 小时前
【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价
python·机器学习·sklearn