一、爬虫前准备

1.工具:pychram(python3.7)

2.库:random,requests,fake-useragent,json,re,bs4,matplotlib,worldcloud,numpy,PIL,jieba

random:生成随机数

requests:发送请求获取网页信息

fake-useragent:生成代理服务器

json:数据转换

re:用于正则匹配

bs4:数据过滤

matpotlib:图像处理

worldcloud:生成词云

numpy:图像处理

PIL:图像处理

jieba:对中文进行分词(本次未用到)

3.爬虫流程

使用代码模拟浏览器发送请求-->浏览器返回信息(html/json)-->提取有用的信息-->进行储存

1)发起请求

使用代码向目标站点发送请求,即发送一个Request

请求应包含:请求头、请求体等

2)获取响应内容

发送请求成功后,会获得站点返回的信息(Response)

3)提取信息

解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery,xpath等

解析json数据:json模块

4)储存信息

以文件存储

存入数据库

二、开始爬虫

1.防止ip被封

为了防止多次访问某站点导致IP被封,对IP进行伪装。

找一些提供免费IP的网站爬取IP数据存储到本地文件中,将爬虫进行到底。

  1. # __Author__ :"Chen Yang"
  2. # __Time__: 2019/8/22 20:56
  3.  
  4. import requests
  5. from fake_useragent import UserAgent
  6. import re
  7.  
  8. def create_pool(ur):
  9. url = ur
  10.  
  11. ua = UserAgent()
  12. # fake_useragent 提供的随机生成代理服务器
  13. headers = {"User-Agent": ua.random}
  14.  
  15. r = requests.get(url, headers=headers)
  16. # 正则匹配所有IP
  17. comment = re.findall('<td data-title="IP">(.*)</td>', r.text)
  18. # 正则匹配所有端口
  19. port = re.findall('<td data-title="PORT">(.*)</td>', r.text)
  20.  
  21. print(r.text)
  22. print(comment)
  23. print(port)
  24. # 将IP和端口对应 存入文件
  25. with open('ip-port.text', 'a', encoding='utf-8') as f:
  26. for i in range(len(comment) - 1):
  27. f.write(comment[i] + ":" + port[i])
  28. f.write('\n')
  29.  
  30. if __name__ == "__main__":
  31. # 爬取该网页前7页IP
  32. for i in range(6):
  33. ur = 'http://www.qydaili.com/free/?action=china&page=' + str(i)
  34. create_pool(ur)

IP爬取

2.IP爬取成功后正式开始爬取某条

xhr:XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。

某条文章是动态随机推荐的,每次进入头条页面的文章都不同。

在多次分析后找到realtime_news/的xhr

访问open_url,爬取标签

至此,基本可以确定realtime_news的xhr就是要爬的文件。

思路:爬取realtime_news的xhr的文件-->获取其中open_url-->爬取标签-->生成词云

  1. import random
  2. import requests
  3. from fake_useragent import UserAgent
  4. import json
  5. import re
  6. from bs4 import BeautifulSoup
  7. import matplotlib.pyplot as plt # 用于图像处理
  8. from wordcloud import WordCloud# 用于生成词云
  9. import numpy as np
  10. from PIL import Image
  11.  
  12. # 词云形状文件 需要替换成你本地的图片
  13. backgroud_Image = np.array(Image.open("man.jpg"))
  14. # 词云字体 需要替换成你本地的字体
  15. WC_FONT_PATH = '黄引齐招牌体.ttf'
  16.  
  17. def get_ip():
  18. f = open("ip-port.text", 'r') # 从IP-port中读取IP
  19. ip_all = []
  20. for k in f:
  21. line = f.readline()
  22. ip_all.append(line[:-1]) # 去除/n
  23. f.close()
  24. # print(ip_all)
  25. i = random.randint(0, len(ip_all)-1)
  26. pr = ip_all[i]
  27. print("ip地址为:{}".format(pr))
  28. return pr
  29.  
  30. def get_info():
  31. '''
  32. 使用爬取的ip来进行ip代理
  33. 使用fake_useragent进行服务器代理,防止IP被封
  34. '''
  35. url = 'https://www.toutiao.com/api/pc/realtime_news/'
  36.  
  37. ua = UserAgent()
  38. agent = ua.random
  39. print("代理为:{}".format(agent))
  40. header = {"User-Agent": agent}
  41.  
  42. ip = get_ip()
  43. proxies = {'url': ip}
  44.  
  45. try:
  46. # 获取首页信息
  47. r = requests.get(url, headers=header, proxies=proxies)
  48. global_json = json.loads(r.text)
  49. print(global_json)
  50. except:
  51. print("请求头条主页失败")
  52.  
  53. # 获取首页信息动态推荐文章的地址
  54. article = []
  55. for i in range(len(global_json['data'])):
  56. article.append(global_json['data'][i]['open_url'])
  57. # 头条得子文章页标号 会随机发生变化
  58. #print(article)
  59.  
  60. # 取8篇文章得label
  61. for i in range(7):
  62. # 访问动态推荐文章地址
  63. content = "http://toutiao.com" + article[i]
  64. try:
  65. respon = requests.get(content, headers=header, proxies=proxies)
  66. # 输入返回对象的文本值
  67. # print(respon.text)
  68. except:
  69. print("请求文章失败")
  70.  
  71. # 指定编码等于原始页面编码
  72. respon.encoding = respon.apparent_encoding
  73. # 获取想要地址对应的BeautifulSoup
  74. html = BeautifulSoup(respon.text, 'lxml')
  75. # 选择 第六个script标签 即数据所在标签
  76. try:
  77. src = html.select('script')[6].string
  78. #print(src)
  79. except:
  80. print("获取数据失败!")
  81. result = []
  82. try:
  83. # 正则找到数据中标签字段
  84. labels = re.findall('tags:(.*),', respon.text)
  85. #print(type(labels))
  86. # strip()去空格
  87. # 把字符串转为列表
  88. result = labels[0].strip()
  89. # print(type(result))
  90. # print(labels)
  91. # eval() 将字符串列表 转为列表
  92. result = eval(result)
  93. # print(result)
  94. except:
  95. print("未获得labels")
  96. with open("labels.json", 'a', encoding='utf-8') as f:
  97. for i in range(len(result)-1):
  98. f.write(result[i]['name'])
  99. f.write(' ')
  100.  
  101. def cut_word():
  102. '''
  103. 生成词云
  104. :return:
  105. '''
  106. with open("labels.json", 'r', encoding='utf-8') as f:
  107. label =f.read()
  108. wl = "".join(label)
  109. print(wl)
  110. return wl
  111.  
  112. def create_word_cloud():
  113. '''
  114. 生成词云
  115. :return:
  116. '''
  117. # 设置词云形状图片
  118. #wc_mask = np.array(WC_MASK_IMG)
  119. # 设置词云配置 字体 背景 大小等
  120. wc = WordCloud(background_color='white', max_words=2000, mask=backgroud_Image, scale=4,
  121. max_font_size=50, random_state=42, font_path=WC_FONT_PATH)
  122. # 生成词云
  123. wc.generate(cut_word())
  124.  
  125. # 在只设置mask情况下, 你会得到一个图片形得词云
  126. plt.imshow(wc, interpolation='bilinear')
  127. #plt.axis("off")
  128. plt.figure()
  129. plt.show()
  130.  
  131. if __name__ == '__main__':
  132. get_info()
  133. create_word_cloud()

爬虫

爬虫之使用requests爬取某条标签并生成词云的更多相关文章

  1. python爬取豆瓣流浪地球影评,生成词云

    代码很简单,一看就懂. (没有模拟点击,所以都是未展开的) 地址: https://movie.douban.com/subject/26266893/reviews?rating=&star ...

  2. python 爬取腾讯微博并生成词云

    本文以延参法师的腾讯微博为例进行爬取并分析 ,话不多说 直接附上源代码.其中有比较详细的注释. 需要用到的包有 BeautifulSoup WordCloud jieba # coding:utf-8 ...

  3. Python爬虫入门——使用requests爬取python岗位招聘数据

    爬虫目的 使用requests库和BeautifulSoup4库来爬取拉勾网Python相关岗位数据 爬虫工具 使用Requests库发送http请求,然后用BeautifulSoup库解析HTML文 ...

  4. scrapy-redis爬取豆瓣电影短评,使用词云wordcloud展示

    1.数据是使用scrapy-redis爬取的,存放在redis里面,爬取的是最近大热电影<海王> 2.使用了jieba中文分词解析库 3.使用了停用词stopwords,过滤掉一些无意义的 ...

  5. python爬取微信信息--显示性别/地域/词云(附代码)

    看到一篇有意思的博客 利用微信开放的接口itchat 可以获取登录的微信好友信息 并且利用图像工具显示分析结果 非常的有意思 记录下实现过程 并提供可执行代码 首先要 import itchat 库 ...

  6. 爬虫-----selenium模块自动爬取网页资源

    selenium介绍与使用 1 selenium介绍 什么是selenium?selenium是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作.     sel ...

  7. # 爬虫连载系列(1)--爬取猫眼电影Top100

    前言 学习python有一段时间了,之前一直忙于学习数据分析,耽搁了原本计划的博客更新.趁着这段空闲时间,打算开始更新一个爬虫系列.内容大致包括:使用正则表达式.xpath.BeautifulSoup ...

  8. 一起学爬虫——使用Beautiful Soup爬取网页

    要想学好爬虫,必须把基础打扎实,之前发布了两篇文章,分别是使用XPATH和requests爬取网页,今天的文章是学习Beautiful Soup并通过一个例子来实现如何使用Beautiful Soup ...

  9. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

随机推荐

  1. pymysql常见报错

    错误一: AttributeError: module 'pymysql' has no attribute 'connect' 有道翻译 AttributeError:模块'pymysql'没有属性 ...

  2. gradle配置多个代码仓库repositories

    repositories { mavenCentral() maven { url "https://jitpack.io" } maven { url "http:// ...

  3. c2000 N2A1 设置 KonNaD Settings & User Manual

    KonNaD Settings & User Manual c2000 N2A1  两个开关都推到左边,都设置成off

  4. UML-FURPS+与补充性规格说明

    1.FURPS+ 在统一过程(UP)中,需求按照“FURPS+”模型进行分类. 功能性(Functional):特性.功能.安全性: 可用性(Usability):人性化因素.帮助.文档: 可靠性(R ...

  5. Dynamics CRM - 为 sub-grid 添加 OnChange 事件

    目的: 有的时候我们需要对 sub-grid 内容进行监控,比如在 sub-grid 上添加.删除了一条记录后,要对 Form 上的某个字段值进行更新. 解决方案: 对 sub-grid 添加一个 O ...

  6. Python笔记_第二篇_面向过程_第二部分_3.模块的概述

    这部分内容是非常重要的,分模块的基本概念和一些常用模块的使用,其实常用模块使用这部分也不是太全面,后续或者有机会再通过其他材料进行讲解. 1. 模块的概述: 目前代码比较少,写在一个文件中还体现不出什 ...

  7. Collection接口介绍

    Collection接口介绍 一个Collection代表一组对象,是集合体系中的根接口.一些允许有重复的元素一些不允许,一些有顺序一些没有顺序.JDK不提供此接口具体类的直接实现,只会有子接口和抽象 ...

  8. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码

    iOS精选源码 iOS高仿微信完整项目源码 Khala: Swift 编写的iOS/macOS 路由框架 微信左滑删除效果的实现与TableViewCell的常用样式介绍 实现阴影圆角并存,渐变色背景 ...

  9. Hadoop_课堂笔记1

    1.课程目标 实践性 2.课下需要 在家搭建一个伪分布式 3.大数据概念和意义 08年Nature第一次正式提出大数据概念 常规的数据库:结构化的数据库 TB级的结构化数据管理就很困难,需要分布式 当 ...

  10. c# winform清空ie缓存的几种方法

    很明显 IE的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参 ...