Python 爬虫框架

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.jljson_load格式,没有最外面的{},每条数据间独立)、csvxml格式等
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()
#输出<title>标签的内容,因为会返回一个很长的字符串,所以用extract()单独输出这个标签
#如果只要返回第一个则用extract_first(),并且extract_first()里面可以设置default参数值
#当没有数据时设为默认值,比如:extract_first(default='aaa')
结果就是:<title>内容</title>

(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-1list-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文档)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352