scrapy模块
安装
使用cmd控制台查看scrapy是否安装,没有就安装完再查看。
>conda list
>conda install scrapy
>conda list
创建项目
使用window powershell控制台,先跳转到pycharm项目地址,然后创建项目hello。
创建完成后进入hello目录确定项目主题为dingdian,完成项目创建。
>cd d:
>cd D:\py-workplace
>scrapy startproject hello
>cd hello
>scrapy genspider dingdian wwwwww
打开pycharm,看到项目hello打开。
使用项目
安装
在pycharm的控制台也需要安装scrapy
>pip install scrapy
会有安装提示
Installing collected packages: zope.interface, w3lib, twisted-iocpsupport,
pyasn1, lxml, incremental, hyperlink, hyperframe, hpack, cssselect,
constantly, Automat, Twisted, pyasn1-modules, priority, parsel, jmespath,
itemadapter, h2, service-identity, queuelib, PyDispatcher, protego,
itemloaders, scrapy
原理
爬虫文件在如图dingdian.py文件书写,items.py用于临时存储,middlewares.py中间件,pipelines.py下载管道,settings.py配置文件。
取自Scrapy工作原理
Scrapy Engine:Scrapy引擎
Scheduler:调度器
Downloader:下载器
Spider:爬虫
Item Pipeline:存储数据临时点+管道
Downloader Middlewares:下载中间件
Spider Middlewares:爬虫中间件
Spider爬虫url -> Scrapy引擎 -> Scheduler安排任务request -> Scrapy引擎 -> Downloader Middlewares增加header的cookie等 -> Downloader下载返回response ->Downloader Middlewares判断数据是否有效 -> Scrapy引擎 -> Spider分析数据 -> Scrapy引擎 -> Item Pipeline进入数据库/ Scheduler安排新任务request
使用Twisted这个异步网络库来处理网络通讯,提取结构性数据而编写的应用框架
启动
在根目录下建一个文件:hello/run.py
from scrapy.cmdline import execute
execute(['scrapy','crawl','dingdian'])
注意,[]不要丢了,免得报参数错误
TypeError: execute() takes from 0 to 2 positional arguments but 3 were given
或者进入pycharm的控制台先跳转到项目根目录,再执行scrapy crawl dingdian命令
>cd ../hello
>scrapy crawl dingdian
命令:scrapy crawl quotes
爬取
修改dingdian.py的start_urls和print(response.text)。
import scrapy
class DingdianSpider(scrapy.Spider):
name = 'dingdian'
allowed_domains = ['wwwwww']
# 爬取网址
start_urls = ['https://www.baidu.com/']
def parse(self, response):
print(response.text)
start_urls是需要爬取的网址
修改settings.py的一些参数
# 遵守 robots.txt 协议,但是一般不遵守
ROBOTSTXT_OBEY = False
其他参数均注释,需要启动就去掉注释
USER_AGENT = 'hello (+http://www.yourdomain.com)'
CONCURRENT_REQUESTS = 32
#每次下载后延迟3秒
DOWNLOAD_DELAY = 3
CONCURRENT_REQUESTS_PER_DOMAIN = 16
# 单位时间IP最多用多少次,尽量低
CONCURRENT_REQUESTS_PER_IP = 16
COOKIES_ENABLED = False
TELNETCONSOLE_ENABLED = False
# 定义request headers的值,优先作为基础,可以在request headers增加其他部分
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
# 使用爬虫中间件设置,设置后可以使用
SPIDER_MIDDLEWARES = {
'hello.middlewares.HelloSpiderMiddleware': 543,
}
# 使用下载器中间件设置,设置后可以使用
DOWNLOADER_MIDDLEWARES = {
'hello.middlewares.HelloDownloaderMiddleware': 543,
}
EXTENSIONS = {
'scrapy.extensions.telnet.TelnetConsole': None,
}
# 使用临时存储设置,设置后可以使用,可以向数据库存数据
ITEM_PIPELINES = {
'hello.pipelines.HelloPipeline': 300,
}
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5
AUTOTHROTTLE_MAX_DELAY = 60
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
AUTOTHROTTLE_DEBUG = False
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
了解middlewares.py中间件
下载器中间件HelloDownloaderMiddleware
控制 引擎到下载器中间件def process_request(self, request, spider)
控制 下载器中间件到引擎def process_response(self, request, response, spider)
请求卡死等不报错的异常def process_exception(self, request, exception, spider)
爬取
例子:顶点
选择一个小说
得到://*[@id=“at”]/tbody/tr[1]/td[1]/a
爬取某个小说的每个章节网址
class DingdianSpider(scrapy.Spider):
name = 'dingdian'
# 主要防止域名不含wwwww
allowed_domains = ['wwwwww']
# 爬取网址
start_urls = ['http://www.ddxsku.com/files/article/html/13/13332/index.html']
def parse(self, response):
urls = response.xpath('//*[@id="at"]//tr/td/a/@href').extract()
print(urls)
extract()获取所有
extract_first()获取一个
scrapy选择器
css选择器
xpath选择器
管道
修改pipelines.py,入数据库
下载器中间件
cookie
多个项目
scrapy多个项目
使用 scrapy-redis实现分布式爬虫
Scrapy框架的使用之Scrapy通用爬虫
item loader机制
对接docker
crawlab 爬虫管理平台
scrapy 增量爬虫
爬虫 进阶
scrapy 用管道下图片
爬虫常识