实战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我