Python Scrapy 学习笔记

title: Python Scrapy 学习笔记
summary: 在慕课网学习 Scrapy 时所作的笔记
author: 小 K
datetime: 2021-08-17 16:44

2021-08-28 12:09

tags: Python
Scrapy 笔记 web crawling selenium CSS selector XPath

[TOC]
Python Scrapy 学习笔记 Scrapy 爬虫编码一般过程
  1. 创建项目。这个项目可用包含爬取不同网站站点的多个爬虫。
  2. 访问网站,确定需要爬取的字段。以 website.com 为例。
  3. 创建特定的爬虫。如 ./spiders/website.py。有不同的爬虫模板,具体可以参考文档,这里以默认的为例。
  4. 修改 items.py。按照需要爬取的字段,定义相应的 ItemItemLoader
    • Item 是用来定义字段的。
    • ItemLoader 是用来将提取的字段作一定的数据清洗的。
  5. 修改 website.py。主要是 WebsiteSpider 类里的一些函数,如:
    • def start_requests(self):用于发起网络请求前的一些准备工作,比如模拟登录、处理验证码、提取 cookie 等
    • def parse(self, response, **kwargs):用于解析网络请求。返回新的网络请求或返回 item。如果是返回 item,则要修改 ItemLoader
  6. 修改 pipelines.py。对 item 的处理管道定义在这里。管道就是用来做数据保存的。
  7. 修改 settings.py。或者修改 custom_settings。建议到官方文档查阅(常用如下)
    • USER_AGENT
    • ROBOTSTXT_OBEY:是否遵守 robots.txt
    • DOWNLOAD_DELAY:下载延迟
    • COOKIES_ENABLED
    • COOKIES_DEBUG
    • ITEM_PIPELINES:管道的开关
    • 其他的一些常量
  8. 修改 middlewares.py。增强客制化程度。
  9. 重写 Scrapy 的其他部分,增加客制化程度。如
    • middleware(中间件):比如将 selenium 集成到某个 middleware 进去等。
    • stats collection(数据收集机制):收集额外数据
    • signal(信号机制):使程序更加灵活
    • extension(扩展):本质上,middleware,pipeline 都是由 signal 实现的 extension。重写 extension 是最为底层的修改之一。
parsing(数据提取)技术 CSS 选择器
选择器 解释
.classname 选择类名为 classname
.class::attr(attrname) 选择类名为 classname 的标签中 attrname 的属性值
.class::text 选择类名为 classname 的标签间的内容
#idname 选择 id 为 idname 的标签
XPath
常用的
选择器 解释
//book 选择文档中所有 book 节点
/book 选择当前节点下的 book 节点
* 选择任意节点
//em/text() 所有 em 标签间的文本
包含谓语的
选择器 解释
//title[@lang='eng'] 选择所有 title 节点,且拥有 lang 属性,且属性值为 eng
包含运算符的
运算符 选择器 解释
竖线 //book/title 竖线 //book/price 选择 book 元素的所有 titleprice 元素(竖线因为无法转义,不能打出来)
RegEx
暂未补充
Selenium with Python 服务器识别出 selenium?
  1. 在使用 selenium 前要用以下 cmd 启动 chrome
    1. cd "C:\Program Files\Google\Chrome\Application"
    2. chrome.exe --remote-debugging-port=92
  2. 不能使用下面的 python 代码的原因是:这个命令是要求返回值的,除非使用多线程
  3. os.system('"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=9222')
selenium 不加载图片
在 chromedriver 中的示例如下:
from selenium import webdriver chrome_opt = webdriver.ChromeOptions() prefs = {"profile.managed_default_content_settings.images":2} chrome_opt.add_experimental_option("prefs", prefs) browser = webdriver.Chrome(executable_path="chrome driver's address", chrome_options=chrome_opt) browser.get("the url u want to crawl")

其他浏览器的操作方法可以参考 Selenium disable Image loading in different browsers
将 Selenium 集成到 Scrapy 中
也就是通过重写 downloader middleware,spider 等方式将其集成。
突破反爬的方法 User-Agent 变换
从代码优良度从高到低排序,有以下三个方法:
  1. UA 表 + 随机 UA 函数
    1. settings.py 中定义一个 ua_list
    2. 在需要进行 Request 的地方定义 random_ua(),随用随调
  2. UA 表 + 重写 UserAgentMiddleware
    1. settings.py 中定义一个 ua_list;同时在 settings.py 中修改 SPIDER_MIDDLEWARES 字段值
    2. 修改 middlewares.py。增加 class MyUserAgentMiddleware,重写函数(需查阅文档),如:
      • __init__
      • from_crawler
      • process_request
  3. fake-useragent + 重写 UserAgentMiddleware
    1. 调用 fake_useragent
    2. 同上重写 UserAgentMiddleware
IP 代理池
实现一个 IP 代理池的功能,其实和 User-Agent 的变换是异曲同工的,主要有两种方法。
  1. 自己实现一个 IP 自动变换的功能
  2. 使用现有的工具,如:
    • scrapy-proxies: 随机变换 IP 的中间件
    • scrapy-zyte-smartproxy: 更加智能的随即变换工具,自带 IP 资源,但收费
    • tor: 这本质上是个将请求多次进行转发的浏览器,但可以通过配置作为 IP 变换工具
IP 资源:可以到网上找到免费付费资源。
cookie 池
待添加
分布式爬虫 request 队列,url 去重放入某台主机的内存数据库 redis 中。
小问小答 Scrapy 与命令行
  • scrapy shell [url|file]:交互式爬虫界面
  • scrapy startproject [project_dir]:创建目录,保存项目
  • scrapy genspider [options] :创建项目后使用此命令,创建指定域名下的爬虫
  • scrapy crawl somespider -s JOBDIR=crawls/somespider-1:启动可以暂停的爬虫(通过 ctrl+c 暂停)
  • telnet localhost 6023:用于远程连接一个爬虫,远程查看爬取信息。(其默认链接地址和端口号可在 log 信息中找到)
区分 crawling,scraping 和 parsing
  • Crawling(爬取文档) is essentially following links, both internal and external.
  • Scraping(解析文档) is the act of extraction, for instance from crawling.
  • Parsing(提取数据) is basically breaking it down into pieces, constituent parts, or segments.
爬虫作为动词,可以用 crawl 来表示;作为名词,可以用 spider 或 crawler 来表示
动态网页获取技术
  • selenium [+ pyvirtualdisplay]
  • PhantomJS:无界面浏览器
  • scrapy-splash
  • selenium grid
  • splinter
HTTP状态码分类
分类 描述
1xx 信息,服务器收到请求,需要请求者继续执行操作
2xx 成功,操作被成功接收并处理
3xx 重定向,需要进一步的操作以完成请求
4xx 客户端错误,请求包含语法错误或无法完成请求
5xx 服务器错误,服务器在处理请求的过程中发生了错误
学习过程中用到的包或工具 scrapy
Python Scrapy 学习笔记
文章图片

  1. "引擎"从"爬虫"获取种子url。
  2. "引擎"将种子url推入"调度器",并向“调度器”请求一个url。
  3. “调度器”返回“引擎”一个url。
  4. ”引擎“将url送入”下载器“,同时中间经过”下载器中间件“。
  5. ”下载器“把下载的页面又通过”下载器中间件“,发送回”引擎“。
  6. ”引擎“将下载的页面送入”爬虫“,同时中间经过”爬虫中间件“。
  7. ”爬虫“解析下载的页面(这部分就是我们最经常写的解析方法),把结果和新链接发给”引擎“,同时经过”爬虫中间件“。
  8. ”引擎“将结果发送给pipeline,把新链接发给”调度器“,并向“调度器”请求一个url。
  9. 重复上述过程,直到”调度器“中没有剩余链接。
————————————————
版权声明:本文为CSDN博主「joker1993」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011423...
scrapy.selector
>>> from scrapy.selector import Selector >>> body = 'good' >>> Selector(text=body).xpath('//span/text()').get() 'good'

scrapy.http
>>> from scrapy.selector import Selector >>> from scrapy.http import HtmlResponse >>> response = HtmlResponse(url='http://example.com', body=body) >>> Selector(response=response).xpath('//span/text()').get() 'good'

w3lib
w3lib 是处理 html 文档的包,也是 Scrapy 的依赖包之一。eg. w3lib.html.remove_tags 可以很方便的去除 html 中的标签。
mysql-connector-python
MySql 官方推出的 Python API。
PhantomJS
PhantomJS是一个基于webkit的JavaScript API。它使用 QtWebKit 作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。
作者:HelloJames
链接:https://www.jianshu.com/p/821...
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
pyvirtualdisplay
python 包,可以虚拟显示图形化的界面。
使用场景:在 Linux 服务器环境下使用 selenium 进行爬虫,而 selenium 需要图形化界面,这时候就可以用 pyvirtualdisplay 来虚拟图形化界面。例如:
from pyvirtualdisplay import Display display = Display(visible=0, size=(800, 600)) display.start()""" 这里是正式代码 """display.stop()

redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
Python 虚拟环境
  • venv:Python 自带的虚拟环境生成器
  • virtualenv:最流行的,强大的虚拟环境生成器
  • virtualenvwrapper:为了方便 virtualenv 使用,而进行的封装,但只能在 Linux 环境下使用
  • 【Python Scrapy 学习笔记】virtualenvwrapper-win:virtualenvwrapper 的 Windows 版本。使用方法:
    1. 使用前定义环境变量 WORKON_HOME,用来集中保存各个虚拟环境。
    2. 在命令行中键入 virtualenvwrapper 即可查看为数不多的常用命令。

    推荐阅读