精通python爬虫框架scrapy读书笔记
一、初识Scrapy
1、Scrapy能够识别残缺的HTML
- 可以直接使用Beautiful Soup或lxml
- Scrapy还提供了lxml更高级的Xpath接口——selectors
2、社区
- https://groups.google.com/ forum/#!forum/scrapy-users
- http:// stackoverflow.com/questions/tagged/ scrapy
3、更新
http://doc.scrapy.org/en/latest/news.html
二、理解HTML和XPath
1、树表示法
检查网页源代码——Elements——Properties
2、使用XPath选择HTML元素
/html——[…]
/html/body——[
//a——会选择所有的连接
//a/@href——可以使用符号@来访问该属性
//a/text()——只选取文本
//a[@href=”https://www.iana.org/domains/example"] ——选择href为这个的超链接
例子:
获取id为“firstHeading”的h1标签下span中的text
1
//h1[@id="firstHeading"]/span/text()
获取id为‘toc’的div标签内的无序列表ul中的所有链接的url
1
//div[@id="toc"]/ul//a/@href
获取class属性包含“ltr”以及class属性包含“skin-vector”的任意元素内所有标题元素(h1)中的文本。这两个字符串可能在同一个class中,也可能在不同的class中。
1
//*[contains(@class,"ltr") and contains(@class,"skin-vector")]//h1/text()
contains()函数可以让你选择包含指定类的所有元素
选择class属性值为“infobox”的表格中第一张图片的url
1
//table[@class="infobox"]//img[1]/@src
选择class属性以“reflist”开头的div标签中所有的url
1
//div[starts-with(@class,"reflist")]//a/@href
选择子元素包含文本“References”的元素之后的div元素中所有链接的URL
1
//*[text()="References"]/../following-sibling::div//a
获取页面中每张图片的url
1
//img/@src
ID通常是最可靠的
1
//*[@id="more_info"]//text()
三、爬虫基础
1、安装scrapy
1 | pip install scrapy |
2、升级scrapy
- 升级
1 | pip install --upgrade Scrapy |
- 降级
1 | pip install Scrapy==1.0.0 |
3、scrapy调试问题,可以使用–pdb参数启动交换试,以避免发生异常
1 | scrapy shell --pdb "https//gumtree.com" |
4、Item
- 需要对爬取的数据进行清洗,来替换extract()
1 | response.xpath("..h1").re('<h1>(.*?)</h1>')[-1] |
说明
xpath和css都会返回选择器,只有当调用extract()或者re()方法才会得到真是的文本数组
5、一个真正的Scrapy项目
- 创建一个项目
1 | scrapy startproject properties |
声明item
- 重新定义PropertiesItem类
1 | class BilispiderItem(scrapy.Item): |
- 爬虫中引入item
1 | item = BilispiderItem() |
说明:
我们在输出记录中看到,没有包含字段值的DEBUG了,这是因为scrapy是围绕着Item的概念构建的,可以使用管道,对其进行过滤和丰富了,并通过“Feed exports”将其以不同的格式输出存储到不同的地方。
- 保存文件
1 | scrapy crawl bili2 -o item.json |
- 上传文件
1 | scrapy crawl bili2 -o "ftp://user:pass@ftp.scrapybook.com/items.json" |
- ItemLoader
1 | l = ItemLoader(BilispiderItem(),response=response) |
说明:
ItemLoader 提供了许多有趣的结合数据以及对数据进行格式化和清洗的方式。Item通过不同的处理器传递XPath/Css表达式的值。处理器是一个快速而又简单的函数。例如Join()可以将//p结合成一个条目。MapCompose()。可以使用Python函数或者函数链。例如MapCompose(float)可以将字符串数据转换为数值,而MapCompose(Unicode.strip,Unicode.title)可以删除多余空白符。等等。
ItemLoader和处理器是基于编写并支持了成千上万个爬虫的人们的抓取需求而开发的工具包。
- 创建contract
1 | contract有点像为爬虫设计的单元测试。它可以快速知道哪里有运行异常。 |
1 | """ This is Function parses a property page. |
运行contract
1 | scrapy check bili2 |
- 抽取更多的url
1 | start_urls = ( |
- 获取文件作为url的源
1 | start_url = [i.strip() for i in open('todo.urls.txt').read] |
- 获取链接地址urljoin的使用
1 | import urllib |
- 编写垂直和水平双向抓取网页
1 | def parse(self,response): |