爬虫——scrapy框架

本文详细介绍了使用Scrapy框架进行网页爬取,包括设置ROBOTSTXT_OBEY、DOWNLOAD_DELAY和请求头,定义Item结构,利用XPath解析数据,并通过QiubaiproPipeline输出至txt文件的过程。
摘要由CSDN通过智能技术生成

目录

流程:

 1)打开一个终端输入(比如我的d盘下的文件 cd+地址)

 1.初始化项目

2.cd到项目路径

3.生成一个py文件

2.修改setting

3)确认要提取的数据,item项 

Field方法

4.写爬虫程序

yield

xpath

 5.交给管道输出

6.run,执行项目


流程:

1)新建项目 进入项目——>  2)新建爬虫文件  并调整全局配置setting ——>3)明确抓取的内容,写item而且将item类型对象提交给管道,进行储存操作——>  4)写爬虫程序,爬取数据——>   5)交给管道处理数据——>   6)执行爬虫程序,可以通过终端或者在程序里写一个run程序

 1)打开一个终端输入(比如我的d盘下的文件 cd+地址)

cd D:\pycharm_project\爬虫\scrapy操作

 1.初始化项目

scrapy startproject xxxxx(项目名)


eg:scrapy startproject qiubaipro

2.cd到项目路径

cd xxxx(项目名)

eg:cd qiubai

3.生成一个py文件

scrapy genspider xxxx(文件名) www.xxx.com(随便一个网站)

eg:scrapy genspider qiubai v.qq.com

2.修改setting

ROBOTSTXT_OBEY = False
 
DOWNLOAD_DELAY = 1
 
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
}
 
ITEM_PIPELINES = {
   'TXmovies.pipelines.TxmoviesPipeline': 300,
}

1.修改三项内容,第一个是不遵循机器人协议,ROBOTSTXT_OBEY = False

2.第二个是下载间隙,由于下面的程序要下载多个页面,所以需要给一个间隙(不给也可以,只是很容易被侦测到)   DOWNLOAD_DELAY = 1

3.第三个是请求头,添加一个User-Agent

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
}
 

4.第四个是打开一个管道

300表示优先级 ,数值越小优先级越高

ITEM_PIPELINES = {
   'TXmovies.pipelines.TxmoviesPipeline': 300,
}

5.setting.py里面可以设置日志的等级与日志存放的路径

LOG_LEVEL="ERROR"

3)确认要提取的数据,item项 

item定义你要提取的内容(定义数据结构),比如我提取的内容为a描述,我就创建两个变量。

Field方法

实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。下面item的结构可以表示为:{'a':''}

 spiders文件下 name就是我们item类型对象

import scrapy
 
 
class TxmoviesItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    a = scrapy.Field()
    

4.写爬虫程序

yield

yield item#将item提交给管道

xpath

在qiubai.py下

有一个要注意的是如何提取xpathl里的数据,我们的写法有四种,第一种写法拿到selector选择器,也就是原数据,里面有一些我们用不到的东西。第二个extract(),将选择器序列号为字符串。第三个和第四个一样,拿到字符串里的第一个数据,也就是我们要的数据。

items['name']=i.xpath('./a/@title')[0]

items['name']=i.xpath('./a/@title').extract()

items['name']=i.xpath('./a/@title').extract_first()

'''
解析作者名称和段子内容
xpath返回的是列表,但是列表元素一定是selector类型的对象
extract将对象值从selector取出
'''

 

 5.交给管道输出

先设置通道

class QiubaiproPipeline:
    fp = None
    #重写父类的方法,该方法只在开始爬虫时被调用
    def open_spider(self,spider):
        print("开始爬虫")
        self.fp = open('./qiubai.txt','w',encoding='utf-8')
    #专门用来处理item类型对象
    #该方法可以接受爬虫文件提交的item对象
    #该方法每接收一次就调用一次
    def process_item(self, item, spider):
        a = item['a']#取出a
        self.fp.write(a)
        return item
    def close_spider(self,spider):
        print("结束爬虫")
        self.fp.close()

管道可以处理提取的数据,如存数据库。我们这里仅输出

    def parse(self, response):
        '''
        解析段子内容
        xpath返回的是列表,但是列表元素一定是selector类型的对象
        extract将对象值从selector取出
        '''

        a = response.xpath('/html/body/div[@id="content"]/div[@class="content-block clearfix"]/div[@class="col1 old-style-col1"]/div[@id="qiushi_tag_124969920"]/a[@class="contentHerf"]/div[@class="content"]/span').extract()

        item = QiubaiproItem()
        item['a'] = a

        yield item#将item提交给管道

6.run,执行项目

在终端上

scrapy crawl qiubai(爬虫名)

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heart_6662

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值