动态网页抓取(如何选择虎嗅网的网页界面分析工具?(一))

优采云 发布时间: 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

  环境

  以上,数据采集完成。一旦我们有了数据,我们就可以开始分析,但在此之前,我们需要简单地清理和处理数据。

  

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线