自动采集文章网站(基于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功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。

2021-09-21

0 个评论

要回复文章请先登录注册


官方客服qq群


线