实战Python用scrapy进行爬取网站信息(偏科普)

实战Python用scrapy进行爬取网站信息(偏科普)

1.第一步首先百度安装好scrapy,如果安装好在PowerShell里输入scrapy则有以下反应则为安装成功:

安装成功如此

2.输入scrapy startproject spidername 创建新项目

scrapy startproject spidername ###spidername为爬虫文件夹名

将会有以下提示:
在这里插入图片描述
安装提示输入以下代码

cd spiedername
scrapy genspider example example.com  ##example为爬虫名,example.com为爬取网址

按照提示输入后则会有以下提示
在这里插入图片描述
在这之后打开目录页面(我的即为C:\Users\45512\Desktop\1\pig)将会有以下文件被建立
在这里插入图片描述
我们的爬虫程序则在spiders中,打开spiders,
在这里插入图片描述
图中所圈程序则为我们将要编写的爬虫程序。自此scrapy新项目建立完成。

3.开始实战爬取天涯论坛

我们创建好的爬虫工程spider文件打开后代码如下

class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']  #此为允许爬取的路由可注释掉
    start_urls = ['https://search.tianya.cn/bbs?q=']##此为开始爬取数据的开始网址

    def parse(self, response):
    	pass
1)因为我们要爬取的是通过天涯搜索框搜索出来的信息,所以我们要首先分析天涯网页,我们首先在搜索框进行搜索,得到以下网址:

在这里插入图片描述
可见前面的url完全相同而搜索内容则在后面,所以我们便可以定义关键字与url拼接为start_urls

class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']
    search = '重庆邮电大学'
    start_urls = ['https://search.tianya.cn/bbs?q='+search]
2)进行网页元素分析(xpath)

如果浏览器是没有xpath helper插件的可以去安装一个便于分析网页,具体安装方法请百度。
在天涯也面按下f12在开发者模式下选定索要爬取的信息右键复制xpath
在这里插入图片描述
然后在xpath helper中验证
在这里插入图片描述
没有问题及开始编写代码

class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']
    search = '重庆邮电大学'
    start_urls = ['https://search.tianya.cn/bbs?q='+search]

    def parse(self, response):
    	item=TianyaItem()  #此为scrapy中的item文件进行存储爬取数据分类的
    	
    	n=response.xpath('//*[@id="main"]/div[3]/ul/li[1]/p/a[2]/text()').extract()##n则为我们爬取的信息

然后编写item文件(在刚刚spiders的同级文件如图)原则爬啥写啥
在这里插入图片描述
在 TianyaItem下编写 xx(你搜爬取内容定义)=scrapy.Field() 的格式。

import scrapy


class TianyaItem(scrapy.Item):
    # define the fields for your item here like:
    author = scrapy.Field()  #作者
    comefrom = scrapy.Field()  #来源
    time =scrapy.Field()  #时间
    t_url = scrapy.Field()  #标题url
    title = scrapy.Field()  #标题
    article = scrapy.Field() #文章

回到我们的spider文件,为了存储我们爬取的信息要将其存入item文件中最后传回item

class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']
    search = '重庆邮电大学'
    start_urls = ['https://search.tianya.cn/bbs?q='+search]

    def parse(self, response):
    	item=TianyaItem()  #此为scrapy中的item文件进行存储爬取数据分类的
    	
    	n=response.xpath('//*[@id="main"]/div[3]/ul/li[1]/p/a[2]/text()').extract()##n则为我们爬取的信息
    	item['author']=n  #存入item
    	yield item   #传回item

爬取其他信息操作相同,如果每页数据规则且数目相同则可以写一个循环讲每条数据存入item;

class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']
    search = '重庆邮电大学'
    start_urls = ['https://search.tianya.cn/bbs?q='+search]

   def parse(self, response):
        item=TianyaItem()
        time.sleep(5)    ##等待五秒获取总页数与判断页面数据条数
        pag = response.xpath('//*[@class="long-pages"]/a[6]/text()').extract()   #查询出来的总页数
        n1= "".join(pag)   #用于翻页url构建
        try:
            nn=int(float(n1))      #用于翻页判断
        except:
            pass
        datanum = response.xpath('//*[@class="searchListOne"]//ul/li')  #判断页面数据条数
        if len(datanum) <3:
            print("找不到该内容")
            pass

        for i in range(len(datanum)-1):
            n=response.xpath('//*[@class="searchListOne"]/ul//p/a[2]/text()').extract()  #作者  
            if len(n)!=0:
                    item['author']=n[i]
            else:
                item['author']='/'


            c=response.xpath('//*[@class="searchListOne"]/ul//p/a[1]/text()').extract()  #来源
            if len(c)!=0:
                    item['comefrom']=c[i]
            else:
                item['comefrom']='/'



            t=response.xpath('//*[@class="searchListOne"]/ul//p/span[1]/text()').extract()  #时间
            t_str="".join(t)   
            tt=re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',t_str)  #匹配正确时间
            if len(tt)!=0:
                    item['time']=tt[i]
            else:
                item['time']='/'


            t_url=response.xpath('//*[@class="searchListOne"]/ul//div/h3/a/@href').extract()   #标题url
            if len(t)!=0:
                    item['t_url']=t_url[i]
            else:
                item['t_url']='/'

爬取一页的整体数据后我们要进行翻页操作,首先我们要确定翻页的话是什么请求一般网页的请求为get或者post,本篇主要是get请求,判断方法如下:
1.首先我们在浏览器上按下f12,找到network,如果任务过多可以在开发者界面左上的第二个clear按钮将任务清空。
在这里插入图片描述
然后点击页面的下一页则会有许多任务完成
在这里插入图片描述
图中第一个任务点开则可以查看该翻页请求为什么请求,此图为get请求一目了然
在这里插入图片描述
然后接下来要做的就是分析网页的url了,看看翻页后有什么变换
翻页前:
在这里插入图片描述
翻页后:
在这里插入图片描述
很明显多了&pn=数字,这里的数字和页码重合即可知道翻页url拼接规则,回到spider代码进行url拼接

		fy=1                ##定义初始page
        ##进行翻页
        while fy>nn:     ##nn为上面爬取页面所找到的最后一页的页码    
            fy+=1
            fy1=str(fy)  ##对fy格式进行改变便于拼接url
            yield Request(url = start_urls+search+"&pn="+fy1,callback=self.parse)
        ##

这样爬虫基本完成下面展示完整代码

spider.py
from scrapy.http import Request
import pdb
from tianya.items import TianyaItem
import re
global start_urls,search,fy
start_urls ='https://search.tianya.cn/bbs?q='
search='重庆邮电大学'


class TianyaSpider(scrapy.Spider):
    name = 'Tianya'
    allowed_domains = ['focus.tianya.cn']
    search = '重庆邮电大学'
    start_urls = ['https://search.tianya.cn/bbs?q='+search]

    def parse(self, response):
        item=TianyaItem()
        time.sleep(5)    ##等待五秒获取总页数与判断页面数据条数
        pag = response.xpath('//*[@class="long-pages"]/a[6]/text()').extract()   #查询出来的总页数
        n1= "".join(pag)   #用于翻页url构建

        try:
            nn=int(float(n1))      #用于翻页判断
        except:
            pass
        datanum = response.xpath('//*[@class="searchListOne"]//ul/li')  #判断页面数据条数
        if len(datanum) <3:
            print("找不到该内容")
            pass

       
        for i in range(len(datanum)-1):
            n=response.xpath('//*[@class="searchListOne"]/ul//p/a[2]/text()').extract()  #作者  
            if len(n)!=0:
                    item['author']=n[i]
            else:
                item['author']='/'
            


            c=response.xpath('//*[@class="searchListOne"]/ul//p/a[1]/text()').extract()  #来源
            if len(c)!=0:
                    item['comefrom']=c[i]
            else:
                item['comefrom']='/'



            t=response.xpath('//*[@class="searchListOne"]/ul//p/span[1]/text()').extract()  #时间
            t_str="".join(t)   
            tt=re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',t_str)  #匹配正确时间
            if len(tt)!=0:
                    item['time']=tt[i]
            else:
                item['time']='/'
            



            t_url=response.xpath('//*[@class="searchListOne"]/ul//div/h3/a/@href').extract()   #标题url
            if len(t)!=0:
                    item['t_url']=t_url[i]
            else:
                item['t_url']='/'
            
            if len(datanum) >=3:
                yield Request(url=t_url[i],callback=self.parse_1,meta = {"item":item})   #进入url爬取文章
        
        fy=1                ##定义初始page
        ##进行翻页
        while fy>nn:         
            fy+=1
            fy1=str(fy)
            yield Request(url = start_urls+search+"&pn="+fy1,callback=self.parse)
        ##







    def parse_1(self, response):
        item = response.meta['item']
        time.sleep(3)
        tit=response.xpath('//*[@class="s_title"]//span/text()').extract()    #标题
        if len(tit) != 0:
              item['title']=tit[0]
        else:
            item['title']='/'
        

        art = response.xpath('//*[@class="bbs-content clearfix"]//text()').extract()  #文章
        ##数据处理##
        art1 = "".join(art)
        art2 = art1.strip()
        art3 = art2.replace("/u3000","")
        art4 = art3.replace("\u3000","")
        ##
        if len(art4) != 0:
              item['article']=art4
        else:
            item['article']='/'
        
        yield item
items.py
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class TianyaItem(scrapy.Item):
    # define the fields for your item here like:
    author = scrapy.Field()  #作者
    comefrom = scrapy.Field()  #来源
    time =scrapy.Field()  #时间
    t_url = scrapy.Field()  #标题url
    title = scrapy.Field()  #标题
    article = scrapy.Field() #文章

最后在power shell进入到该目录输入scrapy crawl spidername运行爬虫

在这里插入图片描述
运行效果如图
在这里插入图片描述
还可以进行入库处理讲数据存入MongoDB中,有兴趣的可以百度尝试。
入库效果如图
在这里插入图片描述
在这里插入图片描述
第一次写博客教程肯定会有漏洞还请大家多多谅解。有问题可留言或者熟人直接q我

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值