100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Scrapy爬虫框架抓取网易新闻

Scrapy爬虫框架抓取网易新闻

时间:2019-07-08 03:39:27

相关推荐

Scrapy爬虫框架抓取网易新闻

@scrapy

环境安装

Windows

scrapy的安装需要5个依赖库,先安装好这5个依赖库,然后在dos命令中利用pip install安装scrapy框架即可,首先要确保python的目录是添加到系统的环境变量中,否则会无法使用pip命令也进不去python目录。

wheel库:直接在dos窗口中利用pip install wheel命令安装,wheel库用于安装一些wheel文件(.whl,Python的一种打包格式,包含PEP 376兼容安装(一种非常接近于磁盘上的格式)的所有文件),以便在后续的依赖库安装;lxml库:一个解析HTML文件的库,可以读取HTML标签解析HTML文档,方便在后续爬取过程中对requests库获取的HTML文档进行解析,支持Xpath解析方式。lxml库的下载链接https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml,下载对应的python和系统版本之后在dos命令中利用pip install + 文件目录(下载文件右键属性进入“安全”复制对象名称)的形式安装即可。PyOpenssl库:是封装了openssl的python模块,方便使用一些加密解密操作解析数字证书,在python中使用该模块来获取数字证书中的有用信息,PyOpenssl库的下载链接/project/pyOpenSSL/#files(Downloads File中对应的whl文件),同lxml库的安装方式;Twisted库:是一个网络异步框架,其中一个功能就是发送异步请求并检测IO自动切换,是scrapy核心框架的基础框架。Twisted库下载链接https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,下载对应python(cp36)和系统版本(win64),安装方式同lxml库,因为这三个库都是whl文件;Pywin32库:提供了很多访问Windows的API,python和win32在运行过程中兼容的一个库。Pywin32库(我下载的是Build 220)的下载链接/projects/pywin32/files/pywin32/,自己选择合适版本下载后直接点击该exe文件运行安装;Scrapy库:在上述依赖库都安装完成之后,直接利用pip install scrapy命令安装scrapy爬虫框架即可,如此就完成了Windows下的python中scrapy安装。

Anaconda

安装最为简单,进入dos窗口,可以用conda查看自己的Anaconda版本以及利用conda list查看已安装的一些库,直接使用conda install scrapy提示需要安装的依赖库,直接yes等待安装完成即可。

dos命令新建项目

安装好环境之后我们就可以创建项目啦。

指定文件目录,然后利用命令scrapy startproject News(工程名),即创建一个名为News的项目,进入该目录可以看到其中生成的基础文件即为items、pipeline、middleware和settings文件,另外还有一个spiders文件夹,其中需要生成我们爬取的主要实现代码文件;在项目目录下,利用命令scrapy genspider newscraped(爬虫文件名) /rank/ (目标网址)生成一个爬虫文件,命名为newscraped的文件,主要的代码实现----新闻的html文档的爬取和新闻有效信息的提取等都是在这个文件中。

网易新闻爬取实战

基于之前分析过的新浪新闻和搜狐新闻,爬取内容包含标题、正文、类别、来源和相关新闻,另外还有评论部分的爬取存在一定难度未实现,这里我选择同样在正文中上述内容容易实现爬取的网易新闻排行榜,主页链接是/rank/。接下来就是对网页中的信息进行分析。

目标站点分析

分析主页面:我们需要抓取所有的新闻url,然后在scrapy中利用自身回调函数实现对每个新闻的抓取和提取;

目标内容:找到所有url所在的class标签,方便利用css选择器或是xpath进行解析提取,我们在主页中需要的就是url,可以发现其所在的class标签是red或者gray,那在解析的时候只需要锁定这个类标签即可;

附:提取目标内容的标签,一定要查看在源码页面的“网络”中找到主要的ResponseHTML文档,并根据相应的标签确保在响应的HTML中有对应的目标内容,否则利用正则或是css选择器提取得到的内容都是空的。

实现部分

基本文件

我们在dos窗口中创建项目和爬虫的时候,相应地生成了有items、pipeline、middleware、settings和cfg等基本文件,可以在用Pycharm打开查看每个文件的具体代码。

items.py:保存爬取数据的数据结构,比如标题、正文、来源和类别等变量的声明,这样在最后生成的item中会以字典形式呈现;middlewares.py:爬取过程中定义的中间件以及用来处理request、response和exception等操作,基本不需要改动;settings.py:定义配置信息和变量,其中我们需要打开pipeline中定义的管道,以及可以设置管道执行的优先级,另外有个ROBOTSTXT_OBEY在后续出现爬取失败的原因分析时可能是该协议的限制;pipeline.py:用来输出items,这里我们主要用于建立和MySQL的连接管道,实现item到数据库的存储;爬虫文件:在dos界面生成的spider文件,抓取和解析代码的实现都在这个文件中。

爬虫

item文件中的item结构设置,使用给定的声明方式name=scrapy.Field()声明我们最后需要生成的item中的结构,如新闻标题、正文、类别、来源和相关新闻的url等,因为在每个新闻的源码返回的Response中没有评论部分的内容,所以这里虽然设置了评论内容的item部分,但是爬取的结果中都是为空的。

# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()content = scrapy.Field()category = scrapy.Field()news_source = scrapy.Field()reviews_number = scrapy.Field()reviews_hot = scrapy.Field()news_related = scrapy.Field()

spider文件中的爬虫实现代码部分,这是最主要的爬虫部分。对应项目的爬虫类,定义相关的爬取函数方法和解析函数方法,首先是对主页返回的HTML文档进行解析,提取其中所有的新闻url,然后将每个url作为scrapy.Request(url,callback)的参数并调用类中定义的解析函数作为回滚,对每篇新闻利用css选择器或是Xpath提取有效的新闻信息。

import scrapyfrom FinalNews.items import FinalnewsItem #声明item变量需导入class NewscrapedSpider(scrapy.Spider):name = 'newscraped'allowed_domains = ['', '', '', '', '', '', '', '', 'gz.', '', '']#这是新闻url的域名,即headers中的reference或是host部分,必须添加到allowed_domains中,否则对应域名开头的新闻只显示crawled但是无内容start_urls = ['/rank/']#主页的网址,也是dos界面中使用的目标网址def parse(self, response):urls1 = response.css('.red a::attr(href)').extract()urls2 = response.css('.gray a::attr(href)').extract()all_urls = urls1 + urls2#print(all_urls)for url in all_urls:# 评论数和最热评论需要另外url爬取,评论的url最后是随机生成的# reviews_number = ment_count(url) # 获取评论数yield scrapy.Request(url=url, callback=self.parse_detail)#css选择器进行内容的提取def parse_detail(self, response):item = FinalnewsItem()title = response.css('title::text').extract_first()#print(title)content = response.css('.post_text p::text').extract()category = response.css('.post_crumb a::text').extract()if category!='':category = category[1]news_source = response.css('#ne_article_source::text').extract_first()reviews_number = response.css('.post_cnum_tie.js-tielink.js-tiejoincount::text').extract_first()reviews_hot = response.css('.tie-cnt::text').extract()news_related = response.css('.related_article_item a::attr(href)').extract()item['title'] = titleitem['content'] = ''.join(content)item['category'] = categoryitem['news_source'] = news_sourceitem['reviews_number'] = reviews_numberitem['reviews_hot'] = ''.join(reviews_hot)item['news_related'] = ','.join(news_related)yield item #生成最后的item,字典形式

如果在Pycharm的Terminal命令行窗口执行```scrapy crawl newscraped(爬虫文件名)```时,只是显示Crawled 200但是```yield item```是没有产生含有内容的item,考虑就是css选择器的语法或是标签问题,另外就是需要将所有新闻url的域名添加到allow_domains中,这样才能允许其进行爬取,最终能够显示item内容。

如果自己不能保证css选择器的提取是否正确,可以进入逐步调试的命令窗口界面,利用命令scrapy shell 新闻url进入后可以逐步调试查看css的解析结果。

3. setting文件中的相关设置

#开放管道ITEM_PIPELINES = {'FinalNews.pipelines.MySQLPipeline': 300,}#Headers,以防被墙#USER_AGENT = 'FinalNews (+)'USER_AGENT = '在网址的标头中自行复制'# Obey robots.txt rulesROBOTSTXT_OBEY = False

最后的这个设置修改为Flase,因为如果不修改的话,有的网址是禁止爬取的,因为遵循这个robots_txt协议,所以将其修改后可方便爬取。

存储到MySQL数据库

pipeline文件中的存储管道设置,主要就是存储方式设置。我选择的是将爬取的数据,以生成的item字典形式存储到MySQL数据库中,利用pymysql库建立连接和游标,利用sql语句的执行往数据库中写入数据(游标的执行和连接的提交),最后便是关闭游标和连接。

import pymysqlfrom pymysql import cursorsclass MySQLPipeline(object):def __init__(self):# 连接MySQL数据库self.connect = pymysql.connect(host='your host', user='root', password='your password', db='dbname', port=3306)self.cursor = self.connect.cursor()def process_item(self, item, spider):# 往数据库里面写入数据sql = "insert into news(title, content, category, news_source, reviews_number, reviews_hot, news_related) values (%s, %s, %s, %s, %s, %s, %s)"if(item['content']!=''):self.cursor.execute(sql, (item['title'], item['content'], item['category'], item['news_source'], item['reviews_number'], item['reviews_hot'], item['news_related']))mit()return item# 关闭数据库def close_spider(self, spider):self.cursor.close()self.connect.close()

sql语句插入数据到DB中,对于数据库表或是字段对应等问题可自行解决。

至此,简单的爬取网易新闻就实现了,其中爬取结果大致如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。