一、scrapy框架
(一)安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
(二)步骤
1.创建项目
2.配置
不遵循robot协议
请求头
3.编写想要获取的url,并测试
启动命令
scrapy crawl maoyan --nolog
4.设置想要提取的字段
5.实例化item对象
6.提取数据
extract_first() # 提取出一个选择器的data值
extract_first() # 提取出一个list中所有选择器data值,返回值为list
7.存入item对象
(三)目录结构
一定要严格按照这个目录结构,不然运行命令会发生找不到命令的情况。
二、scrapy框架图及组件
三、scrapy发送二次请求
在scrapy项目中,我们想要在parse方法中继续发送一个请求,请求其他url,可以通过yield一个scrapy.Requests()对象完成。这样scrapy引擎就会将它加入调度队列中进行下载,将下载好的结果传给该对象的callback参数锁对应的回调方法。
该对象还有一个meta参数,用来传递参数
四、保存数据
将提取完全的item,保存到MongoDB中。
1.传递
将提取完全的item,使用yield item传递给pipelines.py中的process_item(self, item, spider)函数处理。
2.配置
要想使用pipelines.py中的类来存储item,必须将该类配置到settings.py中。
3.存储
因为这个爬虫程序不止要执行一次,不能每次执行都重新获取一遍,要去重,即增量爬虫。
增量爬虫:让我们爬虫程序每次运行后,都能保证让数据库中数据稳定增长,不会出现重复。
所以给item增加一个datail_hash字段,保存detail_url的hash值。操作数据库时,使用update就可以使用这个字段快速查找是否存在该数据,有的话就更新,没有就插入。
五、自定义下载
即selenium+phantomjs
(一)步骤
1.创建一个MyMiddlerWare.py文件
2.创建一个类
这个类就是我们的下载中间件。当一个request在被下载器下载之前,使用这个中间件捕捉到它,可以提前对这个request做一些操作。当我们自己进行了下载之后,下载器发现就不会再下载了。
使用中间件的process_request方法。
def process_request(self, request, spider)
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from scrapy.http import HtmlResponse
class MyMiddleWare(object):
def __init__(self):
self.driver = webdriver.PhantomJS()
self.wait = WebDriverWait(self.driver,10)
def process_request(self, request, spider):
xpath = request.meta.get('xpath')
self.driver.get(request.url)
if xpath:
self.wait.until(EC.presence_of_element_located((By.XPATH,xpath)))
else:
time.sleep(3)
html = self.driver.page_source
return HtmlResponse(url=request.url,body=html,encoding='utf-8',request=request)
3.配置
想要这个下载中间件生效,就要在settings.py中配置如下内容
六、scrapy设置初始请求的方法
(一)通过start_url
(二)通过start_requests()方法
这种方法的优点是可以手动设置url的一些request信息,比如可以自带meta参数,比如可以给它设置一些请求头。
七、scrapy中使用cookie
将cookie信息添加到请求头中。
scrapy默认会自己定义cookie信息,所以只将cookie设置到请求头中是不会生效的。
还需要设置禁用默认的cookie
八、LinkExtractor类
LinkExtractor类,能帮我们快速找到页面指定位置处的所有链接,且会将相关信息也获取到。
1.导包
from scrapy.linkextractors import LinkExtractor
2.创建一个le对象
对象接收的参数就是你想筛选链接的xpath,他会将你所传入xpath的页面元素中的所有链接及相关信息都筛选出来,这个参数是一个list,可以一次性接收多个xpath。
3.使用extract_links()方法取出
le = LinkExtractor(restrict_xpaths = ['//div[@class="l"]/ul/li/span[1]'])
links = le.extract_links(response)
4.取出url
for link in links循环这个links,使用link.url就能获取到url了。
九、日志
配置
LOG_FILE= 'biquge.log' # 日志文件的名称
LOG_ENABLE =True # 开启日志
LGO_LEVEL = 'DEBUG' # 日志等级
LOG_ENCODING = 'utf-8' # 编码
5种日志等级
- CRITICAL:严重错误
- ERROR:一般错误
- WARNING:警告信息
- INFO:一般信息
- DEBUG:调试信息
十、编写启动文件
from scrapy import cmdline
cmdline.execute('scrapy crawl biquge_spider --nolog'.split())
不用再输入命令,可以直接运行main.py文件运行项目。