Scrapy 爬虫 个人学习经验

本文介绍如何在Ubuntu16.04环境下安装Scrapy并进行基本配置,包括创建项目、编写爬虫、处理数据及使用代理等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装Scrapy

安装环境 : python2.7, Ubuntu16.04

 pip install Scrapy

使用Scrapy

创建工程


scrapy startproject programname

这里写图片描述
scrapy 会创建一个sipders文件里面用于放置爬虫文件

item 用于创建数据类
这里写图片描述

piplines用于处理数据
这里写图片描述

middlewares 中间器 可以在爬虫重写其中的方法
这里写图片描述

settings 用于爬虫的配置

编写爬虫

这里写图片描述
建立一个scrapy.Spider的子类为爬虫类

name 为 爬虫名字,用scrapy crawl name启动爬虫 一定要写

allowed_dimains 为爬取网址的部分

start_urls 开始爬取的url

    rules = (
            #自动从response中根据正则表达式提取url,再根据这个url再次发起请求,并用callback解析返回的结果       
    Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+/')), callback="parse_item"),
          #Rule(LinkExtractor(allow=(r'https://movie.douban.com/tag/\[wW]+'))), # 从网页中提取http链接
         )

Rule类的参数:link_extractor、callback=None、cb_kwargs=None、follow=None、process_links=None、process_request=None
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。还有一个类似的restrict_css

定义 start_requests 用来请求start_urls中的url

def start_requests(self):
        for url in self.start_urls:
            yield Request(url,headers= self.header,callback=self.parse )

编写parse来处理start_requests 返回的请求,爬取所需的信息

数据保存与处理

在items文件中建立scrapy.Item的子类

这里写图片描述

启用piplines处理数据,在settings文件中写入

ITEM_PIPELINES = {
    'projectname.pipelines.pipelinesclassname':300,
}

在pipelines 文件里重写 open_spider(执行spider时,运行一次)

def open_spider(self,spider):
        client = pymongo.MongoClient('localhost',27017)
        database = client['databasesname']
        self.collection = database['collectionname']

这里是用MongoDB,所以open_spider建立与MongoDB的连接

def process_item(self, item, spider):
        data = {
            'Id': item['Id'],
        }
        self.collection.insert(data)
        return item

将item数据写入数据库

数据去重

for id in collection.distinct('Id'):
    num = collection.count({'Id': id})
    for i in range(1,num):
        collection.remove({'Id':id},0)

通过distinct,将相同属性的合并,统计数据,若大于1,则有重复数据,删除多余数据

scrapy使用代理

打开middlewares.py
在middlewares.py中增加一个类,取名:ProxyMiddleware即代理中间件

class ProxyMiddleware(object):

    proxyList = []

    def process_request(self, request, spider):
        pro_ip = random.choice(self.proxyList)
        print "use proxyip "+ pro_ip
        request.meta['proxy'] = "http://"+ pro_ip


DOWNLOADER_MIDDLEWARES = {
    'projectname.middlewares.ProxyMiddleware': 100,
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110
}

或者在重写的star_requests

def start_requests(self):
        for url in self.start_urls:
            yield Request(url,headers= self.header,callback=self.parse,meta = {'proxy':proxyip})

PS:参考了很多博客,就不一一列举了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值