网页新闻抓取(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格式,然后直接训练。
参考文献文章: