Scrapy中文网站:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#intro-tutorial
Scrapy
- 创建项目, 执行如下命令:
scrapy startproject renren
- 创建普通爬虫 cd renren:
scrapy genspider renren_spider renren.com
# 或者
scrapy genspider -t crawl renren_spider renren.com
- 运行爬虫
scrapy crawl renren_spider
# 或者在爬虫项目中创建一个start.py文件
from scrapy import cmdline
cmdline.execute('scrapy crawl renren_spider'.split())
- 修改配置 setting.py
# 配置文件详解:https://blog.csdn.net/u011781521/article/details/70188171
ROBOTSTXT_OBEY=True # 就是要遵守robots.txt 的规则
DOWNLOAD_DELAY=3 # 设置下载延时
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
} # 设置请求的header
- 说明
scrapy_spider,会先调用start_requests访问start_urls中配置的连接,将返回的结果默认交给parse函数处理。如果有特殊处理要求的话,可以自己重构start_requests函数
xpath
可多学习xpath函数
- 根据内容定位元素
driver.find_element_by_xpath("//*[text()='{}']".format(boxInput['定位文本']))
# 包含
driver.find_element_by_xpath('//div[contains(text(), "{}")]'.format(send_data['定位文本']))
CSS
CrawlSpider
需要使用LinkExtractor
和Rule
这两个东西来决定爬虫的具体走向
- allow设置规则的方法:要能够限制在我们想要的url上面,不要跟其他url产生相同的正则表达式即可;
- 什么情况下使用follow:如果爬取的页面需要将满足当前条件的url在进行跟进,那么就设置成True,否则设置成False
- 什么情况下指定callback:若url对应的页面只是为了获取更多的url,并不需要里面的数据,那么可以不指定callback,否则需要指定callbakc
Scrapy Shell
Scrapy shell也称"Scrapy终端",是一个交互终端,使我们可以在未启动spider爬虫的情况下尝试及调试代码。
使用
cmd到对应的爬虫项目,运行如下命令:
scrapy shell +要访问的url
如: scrapy shell http://www.wxapp-union.com/article-6099-1.html
Request和response
常用参数:
- url:这个request对象发送请求的url
- callback:指定一个回调函数,该回调函数以这个request是的response作为第一个参数。如果未指定callback,则默认使用spider的parse()方法。
- method(string):HTTP请求的方法,默认为GET
- headers:请求头,对于一些固定的设置,放在setting.py中指定就可以了,对于那些非固定的,可以在发送请求时指定。
- meta(dict):指定Request.meta属性的初始值。如果给了该参数,dict将会浅拷贝
- encoding:编码,默认是utf–8
- dont_filter:表示不由调度器过滤,在执行多次重复的请求时用得比较多
- errback:在发生错误的时候执行的函数。
下载和处理文件和图片
- 需要在settings.py中的ITEM_PIPELINES中加入:
'scrapy.pipelines.images.ImagesPipeline': 1
elasticsearch
- elasticsearch是语句java开发的,所以一定要安装jdk
- elasticsearch 5及其以上的版本需要安装java8及以上
- cmd 输入java -version查看java的版本号
安装
第一步:下载,https://github.com/medcl/elasticsearch-rtf
第二步:按照上面的步骤执行安装命令
cmd 到:G:\study_code\elasticsearch-rtf-master\bin, 执行elasticsearch即可,然后在浏览器中访问http://127.0.0.1:9200/,如果能访问则表示安装成功
第三步:安装elasticsearch-head,下载地址:https://github.com/mobz/elasticsearch-head
安装node:https://blog.csdn.net/luxiangy1314/article/details/105693054
安装cnpm:自行查找教程
第四步:安装kibana
kibana必须与elasticsearch的版本保持一致
下载地址:https://www.elastic.co/cn/downloads/past-releases
cmd 到G:\study_code\kibana-5.1.2-windows-x86\bin
执行kibana.bat
浏览器访问:http://localhost:5601
Redis
Redis下载地址:https://github.com/ServiceStack/redis-windows/tree/master/downloads
爬虫和反爬虫
1. 对抗过程
网站不可能从根本上解决爬虫的
Request
- Request(url, callback=None, method=‘GET’, headers=None, body=None,
cookies=None, meta=None, encoding=‘utf-8’, priority=0,
dont_filter=False, errback=None, flags=None, cb_kwargs=None)
cookies:登录后Scrapy会自动将我们的cookies加入到Request中
priority:用来影响scheduler的调度优先级
dont_filter:false表明这个request不应该被过滤掉
随机更换user-agent
- 安装fake-useragent,fake-useragent维护的user-agent:https://fake-useragent.herokuapp.com/browsers/0.1.11
pip install fake-useragent
- 编写自己的middleware,用于随机更换user-agnet
在middleware.py中添加如下代码:
from fake_useragent import UserAgent
class RandomUserAgentMiddleware:
# 随机更换User-Agent
def __init__(self, crawler):
super(RandomUserAgentMiddleware, self).__init__()
self.ua = UserAgent()
self.ua_type = crawler.settings.get('RANDOM_UA_TYPE', 'random')
@classmethod
def from_crawler(cls, crawler):
return cls(crawler)
def process_request(self, request, spider):
def get_ua():
# getattr: 取self.ua中的self.ua_type
return getattr(self.ua, self.ua_type)
request.headers.setdefault('User-Agent', get_ua())
- 修改setting.py
DOWNLOADER_MIDDLEWARES 介绍:https://blog.csdn.net/freeking101/article/details/88019714
DOWNLOADER_MIDDLEWARES = {
'tongcheng.middlewares.RandomUserAgentMiddleware': 543,
# 如果您想禁止内置的(在 DOWNLOADER_MIDDLEWARES_BASE 中设置并默认启用的)中间件, 您必须在项目的 DOWNLOADER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}
# 设置ua随机取User-Agent的服务器类型, https://pypi.org/project/fake-useragent/
RANDOM_UA_TYPE = 'random'
ip池
验证码识别
- 图片识别
- 在线打码:云打码
- 人工打码
scrapy配置
- cookies的禁用:用些平台会根据cookies来跟踪
COOKIES_ENABLED = False
- 限速:Scrapy默认在每个网页下载之间的空隙是0
参考文献:https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/autothrottle.html
# 开启自动限速
AUTOTHROTTLE_ENABLED = True
给不同的spider设置不同的setting
在每一个spider中设置独有的custom_settings
setting.py是所用spider的通用设置
custom_settings = {'COOKIES_ENABLED': True}