标签:replace extractor 目的 lex compile 网站服务 [1] 任务 glob
Python作为数据处理方面的一把好手,近年来的热度不断增长。网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合适不过了。
Scrapy是由Python语言开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。相比于传统的爬虫来说,基于scrapy框架的爬虫更加结构化,同时也更加高效,能完成更加复杂的爬取任务。
1、标题
2、内容
3、评论
4、日期,热度和ID
5、程序运行图
1、任务需求
1. 爬取网易,搜狐,凤凰和澎湃新闻网站的文章及评论
2. 新闻网页数目不少于10万页
3. 每个新闻网页及其评论能在1天内更新
2、功能设计
1. 设计一个网络爬虫,能够爬取指定网站的全部页面,并提取其中的文章及评论内容
2. 定时运行网络爬虫,实现每日更新数据
3、系统架构
首先简单介绍下scrapy框架,这是一个爬虫框架
绿线是数据流向,
(1)首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,
(2)下载之后会交给 Spider 进行分析,这里的spider就是爬虫的核心功能代码
(3)Spider分析出来的结果有两种:一种是需要进一步抓取的链接,它们会通过middleware传回 Scheduler ;另一种是需要保存的数据,送入Item Pipeline ,进行处理和存储
(4)最后将所有数据输出并保存为文件
4、实际项目
(1)项目结构
可以看到,NewsSpider-master是完整项目文件夹,下面存放有对应各个网站的爬虫启动脚本debug_xx.py,scrapyspider文件夹存放scrapy框架所需的相关文件,spiders文件夹存放实际的爬虫代码
(2)爬虫引擎
以网易新闻的爬虫news_163.py为例,简要说明部分核心代码:
class news163_Spider(CrawlSpider): # 网易新闻爬虫名称 name = "163news" # 伪装成浏览器 headers = { ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36‘, } #网易全网 allowed_domains = [ "163.com" ] #新闻版 start_urls = [ ‘http://news.163.com/‘ ] #正则表达式表示可以继续访问的url规则,http://news.163.com/\d\d\d\d\d(/([\w\._+-])*)*$ rules = [ Rule(LinkExtractor( allow=( (‘http://news\.163\.com/.*$‘) ), deny = (‘http://.*.163.com/photo.*$‘) ), callback="parse_item", follow=True) ]
根据不同内容的Xpath路径从页面中提取内容,由于网站在不同时间的页面结构不同,因此按照不同页面版式划分成几个if判断句块;
def parse_item(self, response): # response是当前url的响应 article = Selector(response) article_url = response.url global count # 分析网页类型 # 比较新的网易新闻 http://news.163.com/05-17/ if get_category(article) == 1: articleXpath = ‘//*[@id="epContentLeft"]‘ if article.xpath(articleXpath): titleXpath = ‘//*[@id="epContentLeft"]/h1/text()‘ dateXpath = ‘//*[@id="epContentLeft"]/div[1]/text()‘ contentXpath = ‘//*[@id="endText"]‘ news_infoXpath =‘//*[@id="post_comment_area"]/script[3]/text()‘ # 标题 if article.xpath(titleXpath): news_item = newsItem() news_item[‘url‘] = article_url get_title(article, titleXpath, news_item) # 日期 if article.xpath(dateXpath): get_date(article, dateXpath, news_item) # 内容 if article.xpath(contentXpath): get_content(article, contentXpath, news_item) count = count + 1 news_item[‘id‘] = count # 评论 try: comment_url = get_comment_url(article, news_infoXpath) # 评论处理 comments = get_comment(comment_url, news_item)[1] news_item[‘comments‘] = comments except: news_item[‘comments‘] = ‘ ‘ news_item[‘heat‘] = 0 yield news_item
根据正则表达式匹配页面内容中的日期信息:
‘‘‘通用日期处理函数‘‘‘ def get_date(article, dateXpath, news_item): # 时间 try: article_date = article.xpath(dateXpath).extract()[0] pattern = re.compile("(\d.*\d)") # 正则匹配新闻时间 article_datetime = pattern.findall(article_date)[0] #article_datetime = datetime.datetime.strptime(article_datetime, "%Y-%m-%d %H:%M:%S") news_item[‘date‘] = article_datetime except: news_item[‘date‘] = ‘2010-10-01 17:00:00‘
其他函数:
‘‘‘网站分类函数‘‘‘ def get_category(article): ‘‘‘字符过滤函数‘‘‘ def str_replace(content): ‘‘‘通用正文处理函数‘‘‘ def get_content(article, contentXpath, news_item): ‘‘‘评论信息提取函数‘‘‘ def get_comment_url(article, news_infoXpath): ‘‘‘评论处理函数‘‘‘ def get_comment(comment_url, news_item):
(3)运行爬虫并格式化存储
①在settings.py中进行配置
import sys # 这里改成爬虫项目的绝对路径,防止出现路径搜索的bug sys.path.append(‘E:\Python\以前的项目\\NewsSpider-master\scrapyspider‘) # 爬虫名称 BOT_NAME = ‘scrapyspider‘ # 设置是否服从网站的爬虫规则 ROBOTSTXT_OBEY = True # 同时并发请求数,越大则爬取越快同时负载也大 CONCURRENT_REQUESTS = 32 #禁止cookies,防止被ban COOKIES_ENABLED = False # 输出的编码格式,由于Excel默认是ANSI编码,所以这里保持一致 # 如果有其他编码需求如utf-8等可自行更改 FEED_EXPORT_ENCODING = ‘ANSI‘ # 增加爬取延迟,降低被爬网站服务器压力 DOWNLOAD_DELAY = 0.01 # 爬取的新闻条数上限 CLOSESPIDER_ITEMCOUNT = 500 # 下载超时设定,超过10秒没响应则放弃当前URL DOWNLOAD_TIMEOUT = 100 ITEM_PIPELINES = { ‘scrapyspider.pipelines.ScrapyspiderPipeline‘: 300,# pipeline中的类名 }
②运行爬虫并保存新闻内容
爬取下来的新闻内容及评论需要格式化存储,如果在IDE中运行debug脚本,则效果如下:
爬取后会保存为.csv文件,使用Excel打开即可查看:
③如果需要将评论单独提取出来,可以使用csv_process.py,效果如下:
暂时没有
标签:replace extractor 目的 lex compile 网站服务 [1] 任务 glob
原文地址:https://www.cnblogs.com/demodashi/p/9582460.html