动态网页抓取(如何选择虎嗅网的网页界面分析工具?(一))
优采云 发布时间: 2021-09-29 06:05动态网页抓取(如何选择虎嗅网的网页界面分析工具?(一))
一、分析背景:
1. 为什么选择虎嗅
《关于虎嗅》成立于2012年5月,是一个聚合优质创新信息和人的新媒体平台。
2. 分析内容
分析虎嗅网5万篇文章文章的基本信息,包括采集数、评论数等;发现最受欢迎和最不受欢迎的 文章 和作者;分析文章的标题格式(长度、句型)与流行度的关系;展示近年来科技互联网行业的流行词汇
3. 分析工具:
蟒蛇3.6
刮的
MongoDB
Matplotlib
词云
杰巴
数据抓取
我用scrapy抓取了Tiger 文章的首页,从2012年建站到2018年12月7日,抓取文章的时间约为5万篇文章 . 抓取8个信息字段:文章标题、作者、发帖时间、评论数、采集数、摘要、文章链接和文章内容。
1.目标网站分析
这是要抓取的网页界面。您可以看到它是通过 AJAX 加载的。
按F12打开开发者工具,可以看到URL请求是POST类型的,向下滚动到底部查看Form Data,表单中只有3个参数需要提交。尝试后,只提交页面参数即可成功获取页面信息。另外两个参数无关,所以页面爬取的构建非常简单。
接下来,将选项卡切换到预览和响应以查看网页内容,可以看到数据位于数据字段中。total_page为2119,表示文章内容一共2119页,每页有25个文章,一共大概5万条,就是我们要爬取的数量。
Scrapy介绍
Scrapy 是一个用纯 Python 编写的应用框架,用于抓取 网站 数据并提取结构化数据。它具有广泛的用途。借助框架的强大,用户只需要定制开发几个模块,就可以轻松实现爬虫抓取网页内容和各种图片,非常方便。Scrapy使用Twisted['twɪstɪd](它的主要对手是Tornado)异步网络框架来处理网络通信,可以加快我们的下载速度,不用自己实现异步框架,并且收录各种中间件接口,可以灵活完成各种需求。
scrapy是如何帮助我们抓取数据的?
scrapy框架的工作流程:
1.首先,Spider(爬虫)需要通过ScrapyEngine(引擎)将请求url(requests)发送给Scheduler(调度器)。
2.Scheduler(排序、入队)处理,通过ScrapyEngine、DownloaderMiddlewares(可选,主要是User_Agent、Proxy代理)传递给Downloader。
3.Downloader 向 Internet 发送请求并接收下载响应(响应)。通过 ScrapyEngine、SpiderMiddlewares(可选)向 Spiders 发送响应(response)。
4.Spiders 处理响应,提取数据并通过 ScrapyEngine 将数据发送到 ItemPipeline 进行存储(可以是本地或数据库)。
5. 提取的 url 通过 ScrapyEngine 发送给 Scheduler,用于下一个循环。直到没有 Url 请求程序停止并结束。
实现代码
创建项目
scrapy startproject 项目名称
scrapy genspider 爬虫名称 URL
这里首先定义了一个HuxiuV1Spider主类,整个爬虫项目主要在这个类下完成。然后,就可以在下面的headers属性中写一些爬虫的基本配置,比如Headers、proxy等设置。
由于URL是POST请求,我们还需要在FormData中使用formdata={'page':str(i)}添加表单参数,这里需要设置为POST;formdata是POST请求表单参数,只需要加一个page参数就够了。接下来,通过回调参数定义一个 parse() 方法来解析 URL 成功后返回的 Response 响应。在下面的 parse() 方法中,您可以使用 re,xpath 提取响应中所需的内容。
这里我们使用正则表达式提取文章标题、链接、作者等需要的信息,这里将数据保存为列表数据,以便后续存储在mongo数据库中。
成功获取到需要的数据,然后就可以保存了,可以选择输出为csv、MySQL、mongoDB,这里我们选择mongoDB数据库
1 # -*- coding: utf-8 -*-
2 # from scrapy.spider import CrawlSpider
3 from selenium import webdriver
4 import time
5 from scrapy.linkextractors import LinkExtractor
6 from scrapy.spiders import CrawlSpider, Rule
7 # import json
8 from datetime import datetime
9 from ..items import HuxiuItem
10 from scrapy.http import FormRequest
11 import scrapy
12 import json,re
13 class HuxiuV1Spider(scrapy.Spider):
14 name = 'huxiu_v1'
15 allowed_domains = ['huxiu.com']
16 headers={
17 'Referer': 'https://www.huxiu.com/index.php/',
18 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
19 }
20 #post
21 #Form data
22 # page: 2
23 def start_requests(self):
24 url='https://www.huxiu.com/v2_action/article_list'
25 requests=[]
26 for i in range(2,2119):
27 formdata={
28 'page':str(i)
29 }
30 request=FormRequest(url,callback=self.parse,formdata=formdata,headers=self.headers)
31 requests.append(request)
32 return requests
33 def parse(self, response):
34 js=json.loads(response.body.decode())
35 # print(js)
36 req = str(js)
37 idd = re.findall(r'data-aid="(.*?)">', req)#未处理的url(id)
38 title = re.findall(r'class="transition msubstr-row2" target="_blank">(.*?)</a>', req)#标题
39 auth = re.findall(r'class="author-name">(.*?)', req)#作者
40 pinglun = re.findall(r'(.*?)', req)#评论
41 shoucang = re.findall(r'(.*?)', req)#收藏
42 zhaiyao = re.findall(r'(.*?)', req)#未处理的摘要
43 digect = []#摘要
44 for i in zhaiyao:
45 s = i[34:-12]
46 if 'span' in i:
47 s = i[104:-12]
48 digect.append(s)
49 # print(digect)
50 # print(title)
51 detail_url=[]
52 for i in idd:
53 burl = 'https://www.huxiu.com/article/{}.html'.format(i)
54 detail_url.append(burl)
55 # print(detail_url)
56 for i in range(len(idd)):
57 item=HuxiuItem()
58 item['title']=title[i]
59 item["auth"]=auth[i]
60 item['detail_url']=detail_url[i]
61 item['pinglun']=pinglun[i]
62 item['shoucang']=shoucang[i]
63 item['zhaiyao']=digect[i]
64 print(detail_url[i])
65 # yield item
66 yield scrapy.Request(url=detail_url[i],meta={'meta1':item},callback=self.pasre_item)
67 def pasre_item(self,response):
68 meta1=response.meta['meta1']
69 # print('hello')
70 time=response.xpath('//span[@class="article-time pull-left"]/text()|//span[@class="article-time"]/text()').extract()
71 content=response.xpath('//div[@class="article-content-wrap"]/p/text()|//div[@class="article-content-wrap"]/div/text()|//div[@class="article-content-wrap"]/div/span/text()').extract()
72 print(time)
73 ssss=''
74 for i in content:
75 ssss+=i
76 # num = response.xpath('//div[@class="author-article-pl"]/ul/li/a/text()')
77 # wnums=''
78 # for i in num:
79 # wnums = i[:-3]
80 # print(wnums)
81 for i in range(len(time)):
82 item = HuxiuItem()
83 item['title']=meta1['title']
84 item['auth']=meta1['auth']
85 item['detail_url']=meta1['detail_url']
86 item['pinglun']=meta1['pinglun']
87 item['shoucang']=meta1['shoucang']
88 item['zhaiyao']=meta1['zhaiyao']
89 item['time']=time[i]
90 # item['wnums']=num
91 item['content']=ssss
92
93 yield item
蜘蛛
1 # -*- coding: utf-8 -*-
2
3 # Define here the models for your scraped items
4 #
5 # See documentation in:
6 # https://doc.scrapy.org/en/latest/topics/items.html
7
8 import scrapy
9
10
11 class HuxiuItem(scrapy.Item):
12 # define the fields for your item here like:
13 # name = scrapy.Field()
14 title = scrapy.Field()
15 auth = scrapy.Field()
16 detail_url = scrapy.Field()
17 pinglun = scrapy.Field()
18 shoucang = scrapy.Field()
19 zhaiyao = scrapy.Field()
20 time = scrapy.Field()
21 content=scrapy.Field()
22 # wnums=scrapy.Field()
物品
1 # -*- coding: utf-8 -*-
2
3 # Define here the models for your scraped items
4 #
5 # See documentation in:
6 # https://doc.scrapy.org/en/latest/topics/items.html
7
8 import scrapy
9
10
11 class HuxiuItem(scrapy.Item):
12 # define the fields for your item here like:
13 # name = scrapy.Field()
14 title = scrapy.Field()
15 auth = scrapy.Field()
16 detail_url = scrapy.Field()
17 pinglun = scrapy.Field()
18 shoucang = scrapy.Field()
19 zhaiyao = scrapy.Field()
20 time = scrapy.Field()
21 content=scrapy.Field()
22 # wnums=scrapy.Field()
管道
1 BOT_NAME = 'huxiu'
2
3 SPIDER_MODULES = ['huxiu.spiders']
4 NEWSPIDER_MODULE = 'huxiu.spiders'
5
6
7 # Crawl responsibly by identifying yourself (and your website) on the user-agent
8 #USER_AGENT = 'huxiu (+http://www.yourdomain.com)'
9 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
10
11 # Obey robots.txt rules
12 ROBOTSTXT_OBEY = False
13
14 ITEM_PIPELINES = {
15 'huxiu.pipelines.HuxiuPipeline': 300,
16 }
17
18 LOG_FILE='huxiu_v1.log'
19 LOG_ENABLED=True #默认启用日志
20 LOG_ENCODING='UTF-8'#日志的编码,默认为’utf-8‘
21 LOG_LEVEL='DEBUG'#日志等级:ERROR\WARNING\INFO\DEBUG
22
23 setting
环境
以上,数据采集完成。一旦我们有了数据,我们就可以开始分析,但在此之前,我们需要简单地清理和处理数据。
转载于: