创建一个新的Scrapy项目
- 在想放代码的地方 运行
scrapy startproject project_name
一些基本的属性和方法
name
:标识爬虫名字。它在项目中必须是唯一的,不能为不同的爬虫设置相同的名称。start_requests():必须返回一个迭代的 Requests (可以返回一个列表或者写一个生成器函数),Spider将开始抓取这些 requests 。随后的 requests 将从这些初始 requests 中连续生成。
parse(self, response):将被调用来处理为每个 requests 下载的 response 的方法。 response 参数是TextResponse的一个实例,它包含页面内容,并有更多有用的方法来处理它。parse()方法通常解析response ,提取被爬到的数据作为字典,同时寻找新的URL,并从中创建新的请求(Request)。
scrapy.Request(url , callback) : 接受从
url
返回的 response 。并将 response 实例化 。传递给callback 当参数。start_urls =[]: 只定义 start_urls (存放URL的列表)。和 parse() 回调方法. Scrapy 会默认用 start_requests()初始化这些url 。然后默认的调用 parse() 处理。
(调用parse()方法来处理这些URL的每个请求,即使我们没有明确告诉Scrapy这样做。发生这种情况是因为parse()是Scrapy的默认回调方法,对于没有显式分配回调的请求调用。)
运行
- 在project的根目录(有
scrapy.cfg
的地方) 运行scrapy crawl spider_name
运行爬虫
提取数据(CSS选择器)
启动 Scrapy shell
scrapy shell 'http://quotes.toscrape.com/page/1/'
(记得网址加引号。WINDOW加双引号。否则 后面的参数带&就不起作用)CSS选择器
response.css('title') [<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>] #返回的是 list-like object. called SelectorList response.css('title::text').extract() ['Quotes to Scrape'] # 用 extract()提取具体的信息 注意css是选择。extract()是提取。如果只用CSS()不管选择的多细返回的都是list-like object对象 如上面。需要用 extract() 提取具体的信息 # extract()虽然提取具体信息但还是一个list 比如 ['Quotes to Scrape'] 如果需要直接提取比如 STRING 用extract_first() 提取第一个结果(一般选择到位都是一个吧) #或用 response.css('title::text')[0].extract() == response.css('title::text').extract_first() (最好用extract_first()避免发生错误) # example response .css("div.quote") response.css("small.author::text").extract_first() response.css("div.tags a.tag::text").extract() #注意空格 response.css('.author + a::attr(href)') #选择 author class后的 a标签。必须在同一级 #正则提取 response.css('title::text').re(r'Quotes.*') ['Quotes to Scrape'] response.css('title::text').re(r'Q\w+') ['Quotes'] response.css('title::text').re(r'(\w+) to (\w+)') ['Quotes', 'Scrape']
为了找到合适的CSS选择器来使用,你可能会发现使用
view(response)
方法在你的web浏览器的shell中打开 response 页面是很有用的。您可以使用 browser developer tools 或Firebug扩展(请参阅关于使用Firebug进行爬虫和使用Firefox进行爬虫的部分)。Selector Gadget也是一个很好的工具,可以快速找到可供选择的元素的CSS选择器,这在许多浏览器中都可以使用。
除了CSS,Scrapy选择器也支持使用XPath表达式:
response.xpath('//title')
[<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
response.xpath('//title/text()').extract_first()
'Quotes to Scrape'
using XPath with Scrapy Selectors here.
this tutorial to learn XPath through examples
this tutorial to learn “how to think in XPath
使用命令行导出爬取的数据
scrapy crawl quotes -o quotes.json
用 -o。因为历史原因如果重复导出同名文件会追加在上一个文件的末尾而不是覆盖
在小型项目(如本教程中的)中,这应该足够了。但是,如果要使用爬取的项目执行更复杂的事情,可以编写一个 Item Pipeline。 Item Pipeline的占位符文件已经在创建项目时在 project / pipelines.py中为您设置。尽管如果你只是想存储刮取的物品,你不需要实现任何物品管道。
递归寻找链接
next_page=response.css('li.next a::attr(href)').extract_first() #提取网址
>>> '/page/2/'
if next_page is not
next_page = response.urljoin(next_page) #urljoinbuqu补全绝对路径
yield scrapy.Request(next_page, callback=self.parse) #调用自己
#用response.follow替代scrapy.Request
if next_page is not None:
yield response.follow(next_page, callback=self.parse)#不需要补全绝对路径
# 对于<a>元素有一个快捷方式:response.follow自动使用他们的href属性。
for a in response.css('li.next a'):
yield response.follow(a, callback=self.parse)
默认情况下,Scrapy会将重复请求过滤到已经访问过的URL,避免因编程错误而导致服务器过多的问题。这可以通过设置DUPEFILTER_CLASS进行配置。
使用 命令行参数代入爬虫
scrapy crawl quotes -o quotes-humor.json -a tag=humor
用-a 传递参数 这里 self.tag=humor