网页新闻抓取(2.1.2dataflow数据的flow,由执行的engine,步骤)

优采云 发布时间: 2022-03-21 12:04

  网页新闻抓取(2.1.2dataflow数据的flow,由执行的engine,步骤)

  2.1.2数据流

  数据流由执行引擎控制,如图中的各个步骤所示。

  * Step1:scrapy引擎首先获取初始化的URL(Requests)。

  * Step2:然后交给Scheduler调度Requests,请求下一个URL。

  * Step3:调度器将下一个请求返回给scrapy引擎

  * Step4:scrapy引擎通过Downloader Middlewares(process_request())向Downloader发送请求。

  * Step5:Downloader Middlewares完成网页下载后,会生成一个Response并通过Downloader Middlewares发送回scrapy引擎(process_response())。

  * Step6:scrapy引擎收到Response后,会通过Spider Middlewares发送给Spider做进一步处理。

  * Step7:Spider在处理完Response后会将抓取的item和新的Requests(链接在下一页)返回给scrapy引擎。

  * Step8:crapy引擎将处理后的item发送到Item Pipelines,然后将Requests发送回Scheduler,请求下一个可能的URL进行爬取。

  * Step9:从step1开始重复上述操作,直到Scheduler中没有多余的URL请求为止

  提示:解释第 7 步

  Spider分析的结果有两种:

  * 一种是针对需要进一步爬取的链接,比如“下一页”链接,会发回Scheduler;

  * 另一个是需要保存的数据,发送到Item Pipeline进行后期处理(详细分析、过滤、存储等)。

  2.1.3 爬取过程第三部分,爬取中国新闻网半年的各类新闻

  我的环境是Python3.6+Scrapy,Windows,IDE:PyCharm

  3.1 创建一个新的scrapy项目**

  在命令行输入scrapy startproject qqnews

  会出现以下文件

  

  3.1.1个qqnew.py来写我们的主要爬取代码**

  

  首先我们需要导入对应的文件

  from scrapy.spiders import Spider

from qqnews.items import QqnewsItem

  spider会自动从start_urls抓取网页,可以收录多个url。

  并且会默认调用parse函数,parse是蜘蛛抓取网页时的默认调用回调。

  提示:因为我们要抓新闻半年的数据,先通过start_urls获取半年每个月的url,观察url的规律。比如下面这两天的URL就很容易看出规律了,

  我们可以通过拼接字符串来抓取每一天的网址

  * 每天:

  * 每个月:

  代码中最后一句是scrapy.Request(url_month,callback=self.parse_month)生成的

  * url_month: 是解析拼接后要抓取的每一天的url

  * callback=self.parse_month:这句话的意思是每天的url都会调用自定义的parse_month来解析每天网页的内容

  class QQNewsSpider(Spider):

name = 'qqnews'

start_urls=[#'http://www.chinanews.com/society.shtml',

#'http://www.chinanews.com/mil/news.shtml',

'http://finance.chinanews.com/it/gd.shtml',

]

def parse(self,response):

#找到所有连接的入口,一条一条的新闻做解析 //*[@id="news"] //*[@id="news"]/div[2]/div[1]/div[1]/em/a

for month in range(1,8):

for day in range(1,31):

if month is 2 and day>28 :

continue

elif month is 7 and day>6:

continue

else:

if day in range(1,10):

url_month='http://www.chinanews.com/scroll-news/it/2017/0'+str(month)+'0'+str(day)+'/news.shtml'

else:

url_month='http://www.chinanews.com/scroll-news/it/2017/0'+str(month)+str(day)+'/news.shtml'

yield scrapy.Request(url_month,callback=self.parse_month)

  我们已经从前面的代码中获得了每天新闻对应的链接URL,接下来我们应该抓取对应页面的新闻标题和新闻内容。

  即自定义def parse_month(self,response)处理的内容。

  用chrome浏览器右键“查看”,找到对应的每日新闻头条

  scrapy 提供了一种方便的方式来解析网页中的数据,而 文章 中使用 Xpath 进行解析。

  提示:

  * //ul/li 表示选择ul标签下的所有li标签

  * a/@href 表示选择所有a标签的href属性

  * a/text() 表示选择一个标签文本

  * div[@id="content_right"] 表示选择id属性为content_right的所有div标签

   def parse_month(self,response):

#print(response.body)

#到了没一个月的页面下,提取每一天的url

urls=response.xpath('//div[@id="content_right"]/div[@class="content_list"]/ul/li/div[@class="dd_bt"]/a/@href').extract()

for url in urls:

yield scrapy.Request(url,callback=self.parse_news)

  找到新闻头条对应的新闻内容URL后,就可以抓取每日新闻头条和对应的新闻内容了。

  然后通过 self.parse_news,

  存储标题和内容,这是我们第一次导入时使用的item=QqnewsItem()

   def parse_news(self,response):

item=QqnewsItem()

item['title']=response.xpath('//div[@class="con_left"]/div[@id="cont_1_1_2"]/h1/text()').extract()

item['text']='\n'.join(response.xpath('//div[@class="left_zw"]/p/text()').extract())

yield item

  在 items.py 中添加一些类

  class QqnewsItem(scrapy.Item):

# define the fields for your item here like:

text=scrapy.Field()#新闻的内容

title=scrapy.Field()#新闻的标题

  最后,如果要将抓取的内容保存到文件中,可以新建一个begin.py,直接执行下面这句话。

  在 begin.py 中

  from scrapy import cmdline

cmdline.execute("scrapy crawl qqnews -o IT.csv".split())

  然后我们可以根据fastText将爬取的数据处理成fastText格式,然后直接训练。

  参考文献文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线