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()
#输出标签的内容,因为会返回一个很长的字符串,所以用extract()单独输出这个标签
#如果只要返回第一个则用extract_first(),并且extract_first()里面可以设置default参数值
#当没有数据时设为默认值,比如:extract_first(default='aaa')
结果就是:<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文档)

你可能感兴趣的:(Python 爬虫框架)