自动采集文章网站(基于xpath和css表达式机制的改进版spider:文章列表) -足球即时指数
优采云采集器 发布时间: 2021-09-21 16:25自动采集文章网站(基于xpath和css表达式机制的改进版spider:文章列表)
所需环境:
安装模块
建议使用anaconda安装新模块。输入:
conda install -c conda-forge scrapy
conda install -c anaconda pymysql
创建项目
要创建刮擦项目,请在命令行中输入:
scrapy startproject myblog
爬行信息
我们需要的数据包括文章title、文章link、发布日期、文章content,并定义要在item.py中爬网的字段
import scrapy
class myblogitem(scrapy.item):
# define the fields for your item here like:
title = scrapy.field()
href = scrapy.field()
date = scrapy.field()
content = scrapy.field()
pass
通过观察发现,csdn的文章list链接为:
用户名/文章/列表/页面
所以我们创建了spider/list_uspider.py,用于捕获和分析网页。目录结构为:
myblog
│ items.py
│ middlewares.py
│ pipelines.py
│ settings.py
│ __init__.py
│
├─spiders
│ │ list_spider.py
│ │ __init__.py
│ │
│ └─__pycache__
│ list_spider.cpython-36.pyc
│ __init__.cpython-36.pyc
│
└─__pycache__
settings.cpython-36.pyc
__init__.cpython-36.pyc
在列表上,在spider.py中写入listspider类以构造访问请求:
import scrapy
class listspider(scrapy.spider):
name = "list"
allowed_domains = ["blog.csdn.net"]
start_urls = [
"https://blog.csdn.net/qq_42623428/article/list/4",
]
然后编写parser()函数来解析网页:
有很多方法可以从网页中提取数据。scrapy使用基于xpath和css的表达式机制:。有关选择器和其他提取机制的信息,请参阅
下面是xpath表达式及其相应含义的示例:
def parse(self, response):
for item in response.xpath("//div[@class='article-list']//div[@class='article-item-box csdn-tracking-statistics']")[1:]:
url = item.xpath("h4/a/@href").extract()
title = item.xpath("h4/a/text()").extract()[1].strip()
date = item.xpath("div['info-box d-flex align-content-center']/p[1]/span/text()").extract()
print([url, title, date])
打印后,您可以看到以下信息:
'date': '2018-09-30 17:27:01',
'title': '银行业务队列简单模拟',
'url': 'https://blog.csdn.net/qq_42623428/article/details/82912058'}
使用项
对象是一个自定义python字典。您可以使用标准字典语法来获取每个字段的值。(字段是我们为字段指定的属性):
>>> item = myblogitem()
>>> item['title'] = 'example title'
>>> item['title'] = 'example title'
为了返回爬网数据,我们的最终代码是:
import scrapy
from myblog.items import myblogitem
class listspider(scrapy.spider):
name = "list"
allowed_domains = ["blog.csdn.net"]
start_urls = [
"https://blog.csdn.net/qq_42623428/article/list/4",
]
def parse(self, response):
for item in response.xpath("//div[@class='article-list']//div[@class='article-item-box csdn-tracking-statistics']")[1:]:
item = myblogitem()
item['url'] = item.xpath("h4/a/@href").extract()
item['title'] = item.xpath("h4/a/text()").extract()[1].strip()
item['date'] = item.xpath("div['info-box d-flex align-content-center']/p[1]/span/text()").extract()
yield item
跟踪链接
接下来,我们需要通过获得的url地址访问每个文章标题对应的文章内容,然后将其保存在项目['content']中。以下是实现此功能的改进spider:
import scrapy
from myblog.items import myblogitem
class listspider(scrapy.spider):
name = "list"
allowed_domains = ["blog.csdn.net"]
start_urls = [
"https://blog.csdn.net/qq_42623428/article/list/4",
]
def parse(self, response):
for data in response.xpath("//div[@class='article-list']//div[@class='article-item-box csdn-tracking-statistics']")[1:]:
item = myblogitem()
item['url'] = data.xpath("h4/a/@href").extract()[0]
item['title'] = data.xpath("h4/a/text()").extract()[1].strip()
item['date'] = data.xpath("div['info-box d-flex align-content-center']/p[1]/span/text()").extract()[0]
url = data.xpath("h4/a/@href").extract()[0]
request = scrapy.request(url, callback=self.parse_dir_contents)
request.meta['item'] = item
yield request
#在某些情况下,您如果希望在回调函数们之间传递参数,可以使用request.meta
def parse_dir_contents(self, response):
item = response.meta['item']
item['content'] = response.xpath("//article/div[@class='article_content clearfix csdn-tracking-statistics']/div[@class='markdown_views prism-atom-one-light']").extract()[0]
yield item
通过这种方式,我们可以保存所有需要的信息,但现在还有另一个问题:我们刚才做的是从博客目录的一个页面下载文章采集,但是如果我们的博客目录有多个页面,我们是否要从其中下载所有文章采集
在文章列表的第一页的基础上,我们可以通过更改最后一个数字来访问相应的页数,从1开始循环,当我们判断下一页的内容为空时停止,我们将再次改进蜘蛛
import scrapy
from myblog.items import myblogitem
class listspider(scrapy.spider):
name = "list"
allowed_domains = ["blog.csdn.net"]
start_urls = [
"https://blog.csdn.net/qq_42623428/article/list/1",
]
def parse(self, response):
for data in response.xpath("//div[@class='article-list']//div[@class='article-item-box csdn-tracking-statistics']")[1:]:
item = myblogitem()
item['url'] = data.xpath("h4/a/@href").extract()[0]
item['title'] = data.xpath("h4/a/text()").extract()[1].strip()
item['date'] = data.xpath("div['info-box d-flex align-content-center']/p[1]/span/text()").extract()[0]
url = data.xpath("h4/a/@href").extract()[0]
request = scrapy.request(url, callback=self.parse_dir_contents)
request.meta['item'] = item
yield request
next_url = response.url.split('/')
next_url[-1] = str(int(next_url[-1]) 1)
next_url = '/'.join(next_url)
yield scrapy.request(next_url, callback=self.isempty)
def isempty(self, response):
content = response.xpath("//main/div[@class='no-data d-flex flex-column justify-content-center align-items-center']").extract()
if content == [] :
return self.parse(response)
def parse_dir_contents(self, response):
item = response.meta['item']
item['content'] = response.xpath("//article/div[@class='article_content clearfix csdn-tracking-statistics']/div[@class='markdown_views prism-atom-one-light']").extract()[0]
yield item
保存数据
在命令行中输入命令:
scrapy crawl list -o items.json
此命令将以json格式序列化已爬网的数据,并生成items.json文件
同步数据项管道
为了确保采集数据与csdn博客同步,我们必须在更新博客内容后再次抓取数据。但是,再次爬网的数据与保存的数据一致,因此我们需要验证新爬网的数据,然后将其同步到wordpress。所以我们需要使用项目管道
在spider中采集项目后,它将被传递到项目管道,一些组件将按特定顺序处理项目
每个项目管道组件(有时称为项目管道)都是一个python类,它实现了一个简单的方法。他们接收一个项目并通过它执行一些操作。同时,他们还决定项目是继续通过管道,还是被丢弃而不再处理
以下是项目管道的一些典型应用:
pymysql
pymysql正在使用中python3.用于连接x版mysql服务器的库
项目地址参考文件
优采云采集器是一个根据用户提供的关键词,云端自动采集相关文章并发布到用户网站的网站采集器。它能够自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则就可以实现全网采集。采集到内容后,会自动计算内容与所设定的关键词的相关度,只把相关的文章推送给用户。支持标题前缀、关键词自动加粗、插入固定链接、自动提取tag标签、自动内链、自动配图、自动伪原创、内容过滤和替换、电话号码和网址清理、定时采集、百度主动提交等一系列seo功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。