Scrapy
安装Scrapy
pip install scrapy
Scrapy Doc
查看Scrapy的文档,请点击
第一个Scrapy项目
- 到代码位置执行cmd指令
scrapy startproject tutorial
- cd 到tutorial目录下
- 编写爬虫脚本
quotes_spider.py
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
- 执行cmd指令
scrapy crawl quotes
运行爬虫
报错一:no module named win32api
解决方案:原因是缺少win32,到 http://sourceforge.net/projects/pywin32/files/ ,找到对应的版本进行下载,直接安装即可
XPath
xpath是一种解析dom树的语法
记录一下用到的几个语法
-
response.xpath("//div[@class='title']")
表示获取class是title的div节点 -
response.xpath("./h2/text()")
表示获取该节点下h2标签下的文本内容 -
response.xpath("//div[@id='contenttxt']/node()")
表示获取属性id为contenttxt的所有子节点列表 -
.extract()
表示取出节点,extract_first()
表示取出第一个节点
网上说从chrome或者firefox中查看元素并copy as xpath的方式经过测试不正确,不建议使用
Scrapy使用xpath解析之后的中文字符串经过unicode编码,有些字符在python中是没法print的,所以遇到这种‘/xa0’类的字符最好是替换掉
Scrapy保存至json或xml
- 保存至json
scrapy crawl news -o news.json -t json
- 保存至xml
scrapy crawl news --set FEED_URI=out.xml --set FEED_FORMAT=xml
爬取网站
- Freebuf
- 伯乐在线
- 开发者头条
Bug
- 爬取过程中出现过robots.txt的Forbidden情况,在爬虫的
settings.py
中设置ROBOTSTXT_OBEY = False