PySpider
(pip install pyspider
)
使用步骤
安装完成后在命令行输入:pyspider all
打开浏览器输入:127.0.0.1:5000
,就可以看到框架界面
选择创建新任务,在self.crawl
里把start_url
改成要爬的url
,点击save
,然后点击左边的run
,执行后下面follows
后出现url,选择后点击箭头即可到该页面
更多参考
https://blog.csdn.net/weixin_37947156/article/details/76495144
https://www.cnblogs.com/BigFishFly/p/6380046.html
Scrapy框架
安装
1.安装python,在cmd中输入:python --version
显示版本号就行,同时下载安装对应版本VCForPython
,从而让电脑支持VC++环境
2.安装pip
,一般都是有自带,没有的话百度,记得把pip路径(一般在python路径下的:\Scripts
下)加到环境变量path当中,然后在cmd中输入:pip --version
显示版本信息就说明成功
3.用pip安装lxml
,在cmd中输入:pip install lxml
等待安装
4.用pip安装pyOpenSSL
,在cmd中输入:pip install pyOpenSSL
5.用pip安装wheel
,在cmd中输入:pip install wheel
6.去:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted安装对应版本Twisted
,在cmd中定位到文件目录下,输入:pip install 下载的文件名
7.用pip安装Scrapy
,在cmd中输入:pip install Scrapy
8.在cmd中输入:Scrapy
,发现可以成功运行即可
使用步骤
1.创建项目:在命令行输入:scrapy startproject 项目名
2.定义ITEM
容器:编写要爬取的数据,item
是保存爬取到的数据的容器,在项目的items.py
里的class
里加入要爬取的内容,举例:
link = scrapy.Field() #将爬取的链接保存到link变量
3.编写爬虫:在命令行输入:scrapy genspider 爬虫名 url
则会在工程的spiders
目录下生成爬虫文件,其中name
参数作为爬虫名,start_urls
作为初始url(是个列表,可以有多个url),默认把parse
作为其执行函数,在parse函数中通过css选择器获得目标url,并注册parse_question
函数作为目标url的回调函数,要查看有哪些爬虫文件可以输入:
scrapy list
4.配置pipeline
:对爬取数据的处理
5.配置settings
:各种内容配置和变量
6.执行爬虫:在命令行输入:scrapy crawl 爬虫名
使用示例
items.py中:
import scrapy
class PachongItem(scrapy.Item):
news = scrapy.Field() #文件容器中存放news,到时候会生成个键为news的字典
subjects = scrapy.Field()
爬虫文件中:
import scrapy
from pachong.items import PachongItem #导入容器的模块
class EySpider(scrapy.Spider):
name = 'ey' #爬虫名
allowed_domains = ['www.xxx.cn'] #域名
start_urls = ['http://www.xxx.cn/'] #要爬的网址,可以有多个
def parse(self, response):
item = PachongItem() #实例化容器
all_new = response.css(".hoverli") #选择器筛选内容
all_subject = response.css('.xxx ul li a')
all = zip(all_new, all_subject)
for new, subject in all:
item['news'] = new.xpath('@title').extract() #结合css和xpath筛选
item['subjects'] = subject.xpath('text()').extract()
print(item)
yield item #弄一个返回一个内容,如果用return只能返回一次
在settings中设置如下:
ROBOTSTXT_OBEY = False #robot规则选择False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
} #设置默认headers
ITEM_PIPELINES = {
'pachong.pipelines.MongoPipeline': 300, #调用的pipeline,优先级数值300,(越小越优先)
}
MONGO_URI = 'localhost' #mongodb连接
MONGO_DATABASE = 'xxx' #mongodb数据库名
在pipeline中对数据处理如下:
from scrapy.conf import settings #导入settings
import pymongo
class MongoPipeline(object): #采用官方框架
def __init__(self):
self.mongo_uri = settings["MONGO_URI"] #初始化uri和数据库
self.mongo_db = settings["MONGO_DATABASE"]
@classmethod
def from_crwaler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE')
)
def open_spider(self, spider): #连接数据库
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider): #关闭数据库
self.client.close()
def process_item(self, item, spider): #对数据处理
self.db['news'].insert({'new': item['news']}) #存放数据到数据库
self.db['subjects'].insert({'subject': item['subjects']})
return item
更多示例参考
https://www.cnblogs.com/alarm1673/p/4812460.html
https://www.cnblogs.com/xinyangsdut/p/7688130.html
常用指令
1.scrapy startproject 项目
:创建一个项目
2.scrapy crawl 爬虫名
:使用某个爬虫,如果想把爬到的内容导出可以后面加:-o 导出文件名 -t 导出类型
(常用json),举例:
scrapy crawl demo -o content.json -t json
像常用的还有:-o xxx.jl
(json_load
格式,没有最外面的{}
,每条数据间独立)、csv
、xml
格式等
3.scrapy view url
:查看网页源码在浏览器器中的样子,比如:
scrapy view https://www.bilibili.com
4.scrapy parse url
:使用工程中的parse
函数来解析url
5.scrapy bench
:测试一分钟能爬多少条数据
注:
如果不想看到日志输出就加:--nolog
,就行了
选择器
1.xpath使用
可以在交互界面中测试,首先命令行输入:
scrapy shell "网址"
将会爬取整个网页的内容,并且进入一个shell界面,此时,输入:
response.body
则会打印出网页源代码,输入:
response.headers
则会输出报头(需要进入项目的目录下才能用这个指令)
基本语法:
/
代表从根节点选取,//
代表不论节点起始位置,.
代表选取当前节点,..
代表选取当前父节点,@
代表选取属性,nodename
代表选取此节点的所有子节点,下面一些实例:
(1)response.xpath('//标签名')
:会筛选出这些标签的内容,举例:
response.xpath('//title').extract()
#输出标签的内容,因为会返回一个很长的字符串,所以用extract()单独输出这个标签
#如果只要返回第一个则用extract_first(),并且extract_first()里面可以设置default参数值
#当没有数据时设为默认值,比如:extract_first(default='aaa')
结果就是:内容
(2)如果想只输出内容就在标签名后再加/text()
,举例:
response.xpath('//title/text()').extract()
(3)可以定位标签内容,比如百度贴吧里的每层楼的话右键审查元素后可以发现都是放在:div(好多个)/cc/div
下,则可以:
response.xpath('//cc/div/text()').extract()
把response
换成sel
也可以,此时结果就是这个标签下的内容了
(4)可以定位标签元素属性,比如还是百度贴吧,里面的图片链接都是在cc/div/img
标签的src
属性里,就可以:
response.xpath('//cc/div/img/@src').extract()
要看属性就后面/@
属性 就行了
(5)如果要定位某一属性的标签,可以在该标签里用[]
写属性,举例:
response.xpath('//div[@class="xxx"]/ul/li/a/@href')
(6)可以和re()
(正则)嵌套筛选,比如:
response.xpath('//cc/div/text()').re('\d+')[0]
#re返回的是个列表,所以后面不能再用extract(),要取第一个可以re_first()
2.css使用
其类似bs4
,如果是通过标签定位则直接标签名,类就用:.类名
,属性就:标签[属性=xxx]
,这些定位方式之间用空格
隔开,最后要获取的内容用:::属性
来获取,举例:
response.css("title::text").extract()
测试爬取多个类、标签下内容,举例:
response.css('.aaa li a::text').extract()
如果要爬取某个属性,就加attr()
,举例:
response.css('.aaa ul li a::attr(href)'). extract()
如果爬取属性为某个值的,那么可以通过:属性= 值
,来获取,举例:
response.css('div[id=ico_tp]').extract()
如果爬取属性包含某些值的,比如网页里有style
属性为:list-style-1
,list-style-2
的标签,那么可以通过:style*= list-style
,来获取这些标签,举例:
response.css('li[style*=list-style]::text').extract()
注:
几种选择器都可以互相迭代使用,比如先用css选择器定位标签,然后用xpath选择器获取某一属性,举例:
response.css(".hoverli").xpath('@title') #css和xpath迭代使用
response.css('li[style*=list-style]::text').re('xxx(.+)') #css和re迭代使用
引用mongdb
在pipelines
中写调用类,在settings
中设置ITEM_PIPELINES
参考:
http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html
分布式爬虫
通过scrapy-redis
来实现,其基于scrapy
框架和redis
数据库,将一个服务器作为master
端,其他作为slave
端,master端有3个数据库,分别用来指纹比对、控制队列和存放数据,指纹比对实现去重功能,每个爬取源存在唯一指纹,当爬取内容重复时会发现指纹存在,则不再重复爬取;控制队列使得各slave端有序爬取。
使用准备:
在master端的redis.conf
配置文件中注释掉:
bind 127.0.0.1
使得slave端能够连接到master端的redis数据库,可以测试下载master端打开redis-cli
,输入:
127.0.0.1:6379> set key1 "aaaa"
OK
127.0.0.1:6379> get key1
"aaaa"
然后在slave端输入:
redis-cli -h (master ip)
192.168.17.134:6379> get key1
"aaaa"
结果如上能够显示master端内容,则说明连接成功。
更多参考
https://cuiqingcai.com/2621.html
(里面有lxml和xpath的基本用法)
http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
(scrapy0.25文档)