1.安装
win系统下有5个步骤
pip3 install wheel twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip3 install Twisted 17.1.0 cp35 cp35m win_amd64.wheel pip install pywin32 pip install scrapy
2.创建
scrapy startproject 项目名
- 创建普通爬虫文件
cd 项目名 (进入项目目录之后再创建爬虫文件)
scrapy genspider 爬虫文件名 www.xxx.com
- 创建crawlspider的爬虫文件
scrapy genspider -t crawl 爬虫文件名 www.xxx.com
- 一般注释掉 allowed_domains = ['www.xxx.com']
3.配置项目
ROBOTSTXT_OBEY = False 不遵守机器人规则 USER_AGENT = '' 配置UA LOG_LEVEL = 'ERROR' 配置日志级别
中间件配置,管道配置时将注释取消即可
4.执行项目
scrapy crawl 爬虫文件名 scrapy crawl 爬虫文件名 --nolog 不显示日志运行 scrapy crawl 爬虫文件名 -o 文件名.csv/json 保存结果到文件
应用
1.持久化本地存储
1.使用命令,保存的本地文件格式限制为 (json csv xml jl jsonlines marshal pickle)
scrapy crawl 爬虫文件名 -o 本地文件名.csv
2.使用管道
- 在settings.py中开启管道!!!
- items.py文件中添加字段,如 name = scrapy.Field()
- 注意在爬虫文件中要yield item 管道类中才能接受到item
- 在piplines.py文件中的管道类中的process_item函数中处理
- 爬虫类
-
-
-
- open_spider()
- close_spider()
- process_item()
-
-
2.爬取全部网站的数据
手动请求发送,在爬虫文件中的parse中,(callback是回调另一个parse解析函数)
yield scrapy.Request(url,callback)
3.进行post请求发送
spider类中重写start_requests(self)方法,yield scrapy.FormRequest(url,parse,formdata)
def start_requestS(self): for url in self.start_urls: data = { 'kw':'cat'} yield scrapy.FormRequest(url=url,callback=self.parse,formdata=data)
4.处理cookie
- scrapy默认情况下自动处理cookie,在settings.py中配置
COOKIES_ENABLED = False
5.请求传参
- 使用场景:如果使用scrapy爬取的数据没有在同一张页面中,则必须使用请求传参
- 编码流程:
- 需求:爬取的是 首页中电影的名称和 详情页中电影的简介(全站数据爬取)
- 基于起始url进行数据解析(parse)
- 解析数据
-
-
- 电影的名称
- 详情页的url
- 对详情页的url发起手动请求(指定的回调函数parse_detail),进行请求传参(meta)meta传递给parse_detail这个回调函数
-
- 封装一个其他页码对应url的一个通用的URL模板
- 在for循环外部,手动对其他页的url进行手动请求发送(需要指定回调函数==》parse)
- 定义parse_detail回调方法,在其内部对电影的简介进行解析。解析完毕后,需要将解析到的电影名称和电影的简介封装到同一个item中。
- 接收传递过来的item,并且将解析到的数据存储到item中,将item提交给管道
def parse_news(self,response): item = WangyiproItem() item['title'] = title yield scrapy.Request(url=news_detail_url,callback=self.parse_detail,meta={'item':item}) def parse_detail(self,response): item = response.meta['item'] item['content'] = content yield item
5.中间件
- 在settings中要取消注释才能生效
- DOWNLOADER_MIDDLEWARES 下载中间件: 批量拦截所有的请求和响应
- process_request 拦截请求
- 用来进行UA伪装,结合UA列表使用
- 使用代理ip,结合ip池使用
- process_response 拦截相应
可以在爬取动态加载的页面时结合selenium使用
from scrapy import signals import random #批量拦截所有的请求和响应 class MiddlewearproDownloaderMiddleware(object): #UA池 user_agent_list = [ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 " "(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 " "(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 " "(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 " "(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 " "(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 " "(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 " "(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 " "(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 " "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 " "(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24" ] #代理池 PROXY_http = [ '153.180.102.104:80', '195.208.131.189:56055', ] PROXY_https = [ '120.83.49.90:9000', '95.189.112.214:35508', ] #拦截正常请求:request就是该方法拦截到的请求,spider就是爬虫类实例化的一个对象 def process_request(self, request, spider): print('this is process_request!!!') #UA伪装 request.headers['User-Agent'] = random.choice(self.user_agent_list) return None #拦截所有的响应 def process_response(self, request, response, spider): return response #拦截发生异常的请求对象 def process_exception(self, request, exception, spider): print('this is process_exception!!!!') #代理ip的设定 if request.url.split(':')[0] == 'http': request.meta['proxy'] = random.choice(self.PROXY_http) else: request.meta['proxy'] = random.choice(self.PROXY_https) #将修正后的请求对象重新进行请求发送 return request