爬虫框架Scrapy入门 (一)
这段时间一直在学爬虫,做了一些简单的项目,爬取数据的过程中,被封过ip,需要翻墙,为了大规模的数据采集,开始学习scrapy框架。参照的是静觅大神的《Python3网络爬虫开发实战》 本次爬取的网站是scrapy官网http://quotes.toscrape.com
1. scrapy的安装
建议使用anaconda的一键安装,我的电脑上同时有anaconda和pycham,一般pycam使用的anaconda的环境,anaconda的Prompt输入命令 conda install scrapy
2. scrapy入门
创建项目
项目文件可以直接用scrapy命令生成,scrapy startproject tutorial(加文件名)。项目生成之后,会有以下文件目录。
- spiders:spiders包含spider实现,每个项目中都有。
- items.py:定义Item数据结构。
- middlewares.py:定义Spider Middlewares和Downloader Middlewares的实现。
- pipelines.py:定义了Item Pipeline的实现。
- settings.py:它定义了项目的全局配置。
创建Spider
在命令行创建spider,执行命令如下:
cd tutorial(对应项目名)
scrapy genspider quotes(Spider的名称) quotes.toscrape.com(网站域名)
执行之后,spiders文件夹中多了一个quotes.py,这个文件就是刚刚创建的spider。
parse是Spider的一个方法,默认情况下,被调用时start_urls里面的链接完全请求,返回的相应作为唯一的参数传递给函数。该方法复杂返回响应,提取数据或者进一步处理请求。
解析Response
parse()的方法参数response是start_urls的链接爬取后的结果,在parse()方法中。可以直接对response变量中包含的内容进行解析,比如解析源代码,或者根据网页中的链接得到下一个请求。
import scrapy
from tutorial.items import QuoteItem
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
quotes = response.css(".quote")
for quote in quotes:
item = QuoteItem()
text = quote.css(".text::text").extract_first()
author = quote.css(".author::text").extract_first()
tags = quote.css(".tags .tag::text").extract()
item["text"] = text
item["author"] = author
item["tags"] = tags
yield item
next = response.css(".pager .next a::attr('href')").extract_first()
url = response.urljoin(next)
yield scrapy.Request(url = url,callback=self.parse)