1、安装scrapy框架
1. pip install scrapy。
2. 可能会出现问题:
* 在ubuntu下要先使用以下命令安装依赖包:`sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev`,安装完成后再安装`scrapy`。
* 在windows下安装可能会提示`No module named win32api`,这时候先使用命令:`pip install pypiwin32`,安装完成后再安装`scrapy`。
* 在windows下安装Scrapy可能会提示`twisted`安装失败,那么可以到这个页面下载`twisted`文件:`https://www.lfd.uci.edu/~gohlke/pythonlibs/`,下载的时候要根据自己的Python版本来选择不同的文件。下载完成后,通过`pip install xxx.whl`
2、创建项目
1. 创建项目:`scrapy startproject [项目名称]`.
2. 创建爬虫:`cd到项目中->scrapy genspider [爬虫名称] [域名]`.
3、配置python解释器
4、scrapy常见命令
创建项目:scrapy startproject xxx
进入项目:cd xxx #进入某个文件夹下
创建爬虫:scrapy genspider xxx(爬虫名) xxx.com (爬取域)
生成文件:scrapy crawl xxx -o xxx.json (生成某种类型的文件)
运行爬虫:scrapy crawl XXX
列出所有爬虫:scrapy list
获得配置信息:scrapy settings [options]
5、框架结构
放置 spider 代码的目录文件 spiders(用于编写爬虫)。
项目中的 item 文件 items.py(用于保存所抓取的数据的容器,其存储方式类似于 Python 的字典)。
项目的中间件
middlewares.py(提供一种简便的机制,通过允许插入自定义代码来拓展 Scrapy 的功能)。
项目的 pipelines 文件 pipelines.py(核心处理器)。
项目的设置文件 settings.py。
项目的配置文件 scrapy.cfg。
6、抓取多个item 返回多pipeline的处理
两个item
import scrapy
class XieItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
class ComItem(scrapy.Item):
url=scrapy.Field()
两个pipeline
from itemadapter import ItemAdapter
from .items import XieItem,ComItem
# from .items import ComItem
class XiechengNewPipeline:
def process_item(self, item, spider):
print(item['name'])
class ComchengNewPipeline:
def process_item1(self, item, spider):
print(item['url'],'11111')
管道文件配置
ITEM_PIPELINES = {
'xiecheng_new.pipelines.XiechengNewPipeline': 200,
'xiecheng_new.pipelines.ComchengNewPipeline': 300,
}
后面的数字是多少无所谓但是别重复就是,那个是优先级,这样写完代码会发现,item都返回给第一个管道文件,不会进入到第二个管道。
那么我们怎么解决呢,如果只想只有单个管道配置跟单个爬虫文件的话,直接通过判断item类型来进行存储数据,
代码如下,
from itemadapter import ItemAdapter
from .items import XieItem,ComItem
# from .items import ComItem
class XiechengNewPipeline:
def process_item(self, item, spider):
if type(item)==XieItem:
print(item['name'])
class ComchengNewPipeline:
def process_item1(self, item, spider):
if type(item)==ComItem:
print(item['url'],'11111')
但是多个文件不想使用一个通道时候就要使用另一个方法了,这种情况在多个爬虫时候好用,但是单个爬虫还是老老实实的的判断item类型就好了,
多管道方法如下,
在爬虫的开头直接增加配置
import scrapy
from ..items import XieItem,ComItem
# from ..items import ComItem
class DmozSpider(scrapy.Spider):
name = "ca"
allowed_domains = ["wensong.xyz/"]
start_urls = [
'http://wensong.xyz/',
]
custom_settings = {
'ITEM_PIPELINES' : {
'xiecheng_new.pipelines.ComchengNewPipeline': 300}
}
def parse(self, response, **kwargs):
item=XieItem()
url = response.xpath('//title//text()').getall()[0]
item['name']=url
yield item
item1=ComItem()
url1 = 'http://wensong.xyz' + response.xpath('//p//a//@href').getall()[0]
item1['url'] = url1
yield item1
学习链接:https://blog.csdn.net/weixin_43927238/article/details/108280310
7、多页面爬取携带参数
def parse(self, response):
# collect `item_urls`
for item_url in item_urls:
yield Request(url=item_url, callback=self.funcA)
def funcA(self, response):
item = MyItem()
# 处理列表数据
yield Request(url=item_details_url, meta={'item': item},
callback=self.funcB)
def funcB(self, response):
item = response.meta['item']
# 处理新闻详情页的数据
yield Request(url=item_details_url, meta={'item': item},
callback=self.funcC)
def funcC(self, response):
item = response.meta['item']
# 处理新闻解说页的数据
return item
传递多个参数
yield Request(url, meta={'item': item, 'itemB': itemB, 'itemC':itemBC}, callback=self.parse)
取出参数
item = response.meta['item']
itemB = response.meta['itemB']
itemC = response.meta['itemC']
学习链接:https://blog.csdn.net/showhilllee/article/details/72871141
http://c.biancheng.net/view/2027.html
https://blog.csdn.net/qq_41837900/article/details/96489994
8、scrapy如何顺序执行多个爬虫
scrapy如何单线程顺序执行多个爬虫,刚开始我天真的以为将多个excute顺序罗列就能依次执行每个爬虫了,代码如下所示:
from scrapy.cmdline import execute
execute("scrapy crawl huanqiu_finance".split()) # 环球网
execute("scrapy crawl ztcj".split()) # 智通财经网
execute("scrapy crawl p5w".split()) # 全景网
execute("scrapy crawl cs".split()) # 中国证券网
execute("scrapy crawl ccstock".split()) # 证券日报
execute("scrapy crawl ddxsb".split()) # 读懂新三板
execute("scrapy crawl xinhuanet".split()) # 新华网
execute("scrapy crawl money163".split()) # 网易财经
拓展:如何实现多个爬虫循环顺序爬取
首先设置一个循环,接着为每一个爬虫设置一个定时器,让每一个爬虫爬虫一段时间,再运行下一个爬虫即可。具体代码如下,此处设置每一个爬虫运行3600秒
import os
while True:
os.system("scrapy crawl xinhuanet -s CLOSESPIDER_TIMEOUT=3600") # 新华网
os.system("scrapy crawl money163 -s CLOSESPIDER_TIMEOUT=3600") # 网易财经
os.system("scrapy crawl ccstock -s CLOSESPIDER_TIMEOUT=3600") # 证券日报
os.system("scrapy crawl cs -s CLOSESPIDER_TIMEOUT=3600") # 中证网
os.system("scrapy crawl p5w -s CLOSESPIDER_TIMEOUT=3600") # 全景网
os.system("scrapy crawl ztcj -s CLOSESPIDER_TIMEOUT=3600") # 智通财经
os.system("scrapy crawl huanqiu_finance -s CLOSESPIDER_TIMEOUT=3600") # 环球财经
https://www.jianshu.com/p/6e0c24bc4699?utm_source=oschina-app
9、读取scrapy配置文件setting.py中的方法
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
user_agents = settings['USER_AGENTS']