文章目录

    • 前言
  • 1. requests库的基本使用
  • 2. pyquery库的基本使用
  • 3. 爬取知乎热门话题

前言

有些东西想忘都忘不了,而有些却转背就忘了!这段时间忙于找工作和学习mysql,把爬虫搁置一边,今天翻开书发现忘得差不多了,于是想到爬爬知乎热门话题,以此来温习爬虫的基本知识点。

1. requests库的基本使用

1.1 网页获取get和post
前提安装好了requests库,get请求和post请求

#get请求
import requests
r = requests.get('url')
print(r.text)
#post请求
import requestsdata = {'name':'anxiao', 'age':'23'}
r = requests.post('http://httpbin.org/post', data=data)
print(r.text)

1.2 params参数构造url,json()方法将返回结果为json格式的文本转为字典

import requestsdata = {'name':'germy','age':22}r = requests.get('http://httpbin.org/get',params=data)
print(r.text)
print(r.url)
print(type(r.text))
print(r.json())
print(type(r.json()))

1.3 添加headers和cookies

import requestsheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','cookie':'''_zap=f298cc22-ed45-47a7-80c5-0c1f60f3207e; d_c0="ALCjXn2C-A-PTj7MOThWA-1TyjHY7_qdZkc=|1567155243"; _ga=GA1.2.1140563663.1583908405; _xsrf=2e8xkoYwNLLG0bt9CMArPU7UMvI8WifQ; z_c0=Mi4xR1ZYa0RRQUFBQUFBc0tOZWZZTDREeGNBQUFCaEFsVk54UUYzWHdEZEtWcmk3dk5hdmJRd1VKMy16QkJIb0FkTjd3|1586082757|eead4bcc08f01e07ddcdd636c3d4c26a3e5ffd8d; q_c1=805e9a6adc9846dc82db227b9c60baa5|1586083219000|1586083219000; __guid=74140564.3769393844892784600.1595129352315.7222; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1595129354; _gid=GA1.2.512696011.1595129354; SESSIONID=3M4KH7g828eAbnCQSLCj70mOeqT9BvhOqnBpbyWwFgY; JOID=W1sSA02TelvBu4dBBZqPRAINum8aqjNojPy6IjquSDqH3-YIUJXHSZe-iUIEtj16n1FxY7wUR01Jm0KKd28XW9o=; osd=V1EXAUqfcF7DvItLAJiISAgIuGgWoDZqi_CwJzipRDCC3eEEWpDFTpu0jEADujd_nVZ9abkWQEFDnkCNe2USWd0=; tst=h; tshl=; monitor_count=9; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1595130975; KLBRSID=5430ad6ccb1a51f38ac194049bce5dfe|1595131061|1595129347referer: https://www.zhihu.com/people/gu-ying-13-66'''}r = requests.get('url',headers=headers)

1.4 处理二进制数据

r = requests.get('https://github.com/favicon.ico')
#print(r.text)
#print(r.content)
with open('github.ico','wb') as f:f.write(r.content)

1.5 查看响应数据

import requestsr = requests.get('http://www.jianshu.com')
print(r.status_code)#返回状态吗
print(r.headers)#请求头
print(r.cookies)#cookies
print(r.url)#查看url

1.6 会话维持Session

#无法获取网页,未建立会话
import requestsrequests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)#可以获取网页,已建立会话
import requestss = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

2. pyquery库的基本使用

pyquery库是python的一个网页解析库,它的强大之处在于它的css选择器,基pyquery的css选择器来分析和解析网页具有很高的效率。

2.1 初始化

pyquery的初始化有三种,分别为:字符串初始化,url初始化和文件初始化

#字符串初始化
#html = 'html文本内容'
html ='''
<div>
<ul>
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">sceond item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fouth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
from pyquery import PyQuery as pqdoc = pq(html)
#url初始化from pyquery import PyQuery as pqdoc = pq(url='https://cuiqingcai.com')
#文件初始化
from pyquery import PyQuery as pqdoc = pq('fielname'='文件名')

2.2 查找节点
子节点

find():查找子节点
children():查找子孙节点

父节点

parent():获取直接父节点
parents():获取祖先节点

兄弟节点

siblings():获取兄弟节点

有时候用pyquery选择的可能是多个节点,但打印出来的往往是第一个节点,这时候就需要用到items()方法了,使用items()方法就会得到一个生成器,再进行遍历就可以得到每个节点了,可以如下

html = '''
<div class="wrap">
<div id="container">
<ul class="list">
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">sceond item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fouth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
</div>
'''
from pyquery import PyQuery as pqdoc = pq(html)
li = doc('li').items()
print(type(li))for i in li:print(li)

2.3 获取信息

  • 获取属性
attr():获取节点的属性
  • 获取文本
text():获取节点的文本信息

3. 爬取知乎热门话题

3.1 爬取步骤

  • 获取网页源码
  • 分析源码,提取需要的信息
  • 保存信息

3.2 获取网页源码

在爬虫中第一步往往是获取爬取网页的源码,个人认为这是最重要也是最难的一步,因为它涉及的知识点比较多,例如参数的变化规律的寻找,登录验证,绕反爬虫等等。现在要爬的是知乎的入门话题,url为:https://www.zhihu.com/hot,现在利用requests库来获取热门话题的网页源码,如下

import requests
from pyquery import PyQuery as pqdef get_page():#获取网页源码headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','cookie':'''_zap=f298cc22-ed45-47a7-80c5-0c1f60f3207e; d_c0="ALCjXn2C-A-PTj7MOThWA-1TyjHY7_qdZkc=|1567155243"; _ga=GA1.2.1140563663.1583908405; _xsrf=2e8xkoYwNLLG0bt9CMArPU7UMvI8WifQ; z_c0=Mi4xR1ZYa0RRQUFBQUFBc0tOZWZZTDREeGNBQUFCaEFsVk54UUYzWHdEZEtWcmk3dk5hdmJRd1VKMy16QkJIb0FkTjd3|1586082757|eead4bcc08f01e07ddcdd636c3d4c26a3e5ffd8d; q_c1=805e9a6adc9846dc82db227b9c60baa5|1586083219000|1586083219000; __guid=74140564.3769393844892784600.1595129352315.7222; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1595129354; _gid=GA1.2.512696011.1595129354; SESSIONID=3M4KH7g828eAbnCQSLCj70mOeqT9BvhOqnBpbyWwFgY; JOID=W1sSA02TelvBu4dBBZqPRAINum8aqjNojPy6IjquSDqH3-YIUJXHSZe-iUIEtj16n1FxY7wUR01Jm0KKd28XW9o=; osd=V1EXAUqfcF7DvItLAJiISAgIuGgWoDZqi_CwJzipRDCC3eEEWpDFTpu0jEADujd_nVZ9abkWQEFDnkCNe2USWd0=; tst=h; tshl=; monitor_count=9; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1595130975; KLBRSID=5430ad6ccb1a51f38ac194049bce5dfe|1595131061|1595129347referer: https://www.zhihu.com/people/gu-ying-13-66'''}html = requests.get('https://www.zhihu.com/hot', headers=headers)if html.status_code == 200:print("网页获取成功...")return html.textelse:print("网页获取失败...")

值得一提的是这里必须添加User-Agent,它在这里的作用是伪造一个请求头里的User-Aagent,好让服务器响应(来自百度:User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。)。

其次,这里要添加的还有cookie,它的作用是保持登录状态;有了User-Agent和cookie,这样就能获取到包含有热门话题信息的源码了,不然是无法获取有效源码的。

获取方式:登录知乎,切换到热榜下,按F12,然后如下,最后继续复制粘贴就行了

调用get_page()函数后结果如下


可以看到源码里的信息和在浏览器里看到的是一样的,说明成功获取到了要爬取得源码。

3.3 提取需要的信息

要想提取出需要的信息,就得找到它在源码里的位置。通过上面获取到的源码信息,大概能知道热门话题的信息应该与HotList这样的节点有关,接下来去浏览器F12准确定位下;可以发现我们需要的信息在节点为h2,属性为HotItem-title里

接下来用pyquery直接提前就是了,代码如下

def parse_html():#提取信息html = get_page()doc = pq(html)hotlist = doc('.HotItem-title')items = hotlist.items()print("信息提取完成...")return items

现在调用函数parse_html(),遍历items,结果如下

3.4 处理数据并保存到文件

这里主要是利用text()获取信息,以及进行一下输出格式调整,代码如下

def write_to_file(items):#将信息保存到文件中hotlist = []for item in items:hotlist.append(item.text())rank_hotlist = enumerate(hotlist)with open('hotlist.txt', 'w') as f:for index, values in rank_hotlist:f.write(str(index+1) + '  ')f.write(values + '\n')print("信息已保存...")

注意write_to_file()函数要传入parse_html()函数返回的items,最终结果如下

3.5 源码如下

"""
爬取知乎的热点话题
"""
import requests
from pyquery import PyQuery as pqdef get_page():#获取网页headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36','cookie':'''_zap=f298cc22-ed45-47a7-80c5-0c1f60f3207e; d_c0="ALCjXn2C-A-PTj7MOThWA-1TyjHY7_qdZkc=|1567155243"; _ga=GA1.2.1140563663.1583908405; _xsrf=2e8xkoYwNLLG0bt9CMArPU7UMvI8WifQ; z_c0=Mi4xR1ZYa0RRQUFBQUFBc0tOZWZZTDREeGNBQUFCaEFsVk54UUYzWHdEZEtWcmk3dk5hdmJRd1VKMy16QkJIb0FkTjd3|1586082757|eead4bcc08f01e07ddcdd636c3d4c26a3e5ffd8d; q_c1=805e9a6adc9846dc82db227b9c60baa5|1586083219000|1586083219000; __guid=74140564.3769393844892784600.1595129352315.7222; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1595129354; _gid=GA1.2.512696011.1595129354; SESSIONID=3M4KH7g828eAbnCQSLCj70mOeqT9BvhOqnBpbyWwFgY; JOID=W1sSA02TelvBu4dBBZqPRAINum8aqjNojPy6IjquSDqH3-YIUJXHSZe-iUIEtj16n1FxY7wUR01Jm0KKd28XW9o=; osd=V1EXAUqfcF7DvItLAJiISAgIuGgWoDZqi_CwJzipRDCC3eEEWpDFTpu0jEADujd_nVZ9abkWQEFDnkCNe2USWd0=; tst=h; tshl=; monitor_count=9; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1595130975; KLBRSID=5430ad6ccb1a51f38ac194049bce5dfe|1595131061|1595129347referer: https://www.zhihu.com/people/gu-ying-13-66'''}html = requests.get('https://www.zhihu.com/hot', headers=headers)if html.status_code == 200:print("网页获取成功...")return html.textelse:print("网页获取失败...")def parse_html():#提取信息html = get_page()doc = pq(html)hotlist = doc('.HotItem-title')items = hotlist.items()print("信息提取完成...")return itemsdef write_to_file(items):#将信息保存到文件中hotlist = []for item in items:hotlist.append(item.text())rank_hotlist = enumerate(hotlist)with open('hotlist.txt', 'w') as f:for index, values in rank_hotlist:f.write(str(index+1) + '  ')f.write(values + '\n')print("信息已保存...")if __name__ == '__main__':items = parse_html()write_to_file(items)

python爬虫:requests+pyquery实现知乎热门话题爬取相关推荐

  1. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  2. 利用Python爬虫requests+BeautifulSoup实现丁香营销师招聘爬取(源码)

    为什么80%的码农都做不了架构师?>>>    https://download.csdn.net/download/shiyan_31214/10807090 转载于:https: ...

  3. Python爬虫新手入门教学(十):爬取彼岸4K超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  4. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  5. Python爬虫新手入门教学(十七):爬取yy全站小视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  6. python爬虫实战之图灵社区图书信息的爬取(找了久,才找到一个比较好爬取的网站)

    python爬虫实战之图灵社区图书信息的爬取 程序的描述 目标 获取图灵社区(https://www.ituring.com.cn/book)中40本图书的书名 将获取的信息以列表的形式输出到屏幕上, ...

  7. Python爬虫新手入门教学(十三):爬取高质量超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  8. python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频

    [Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...

  9. Python爬虫新手入门教学(二):爬取小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

最新文章

  1. 北斗导航 | Modified Tropospheric:对流层延迟计算(matlab代码)
  2. linux 产生0~1之间的随机数
  3. zookeeper 分布式锁服务
  4. 2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造
  5. LiteOS:剖析时间管理模块源代码
  6. 做双网卡绑定_______物理机在双网卡的情况下做多IP绑定
  7. iframe调用父页面方法_5.1 vue中子组件调用父组件的方法,务必理解自定义事件的重要性...
  8. java线程同步的作用_Java并发编程之线程同步
  9. xshell左侧导航栏_Axure教程:(初级)导航中的页面切换
  10. 数学专业考研计算机,过来人谈数学专业考研:万学之基 万物皆数也
  11. android 7 uc flash,UC浏览器7.2版新增加FLASH游戏支持功能
  12. 计算机月考分析报告,月考成绩分析总结与反思范文5篇
  13. Matlab入门:实现简单的数据剔除
  14. 一说出口就被误解的离职原因,这样补救!
  15. 2022年认证杯SPSSPRO杯数学建模C题(第一阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
  16. 批量 m3u8文件转成MP4的方法--Python实现和 cmd 实现(推荐cmd)--仅粉丝可见
  17. pandas dataframe删除空行或者空列dropna,一般删除指定行或者列drop
  18. HTTP状态码---服务器错误
  19. arcgis直方图导出地图_利用Arcgis地图工具自动输出报告地图图纸
  20. 在Mac下使用Charles抓取Android 7.0以上的Https请求

热门文章

  1. 读书笔记——读《不断进步的电容器-片状陶瓷电容篇》
  2. Linux 文档编辑 : grep 命令详解
  3. 运动----最简单经济最适合的强身健体方式
  4. 关于使用rap2接口模拟数据
  5. python框架django书籍_有Python基础,刚接触web框架的Django初学者。
  6. 电话销售邀约客户技巧 预约客户见面的方法
  7. 检测触摸事件(用户触摸屏幕时提示信息)
  8. Unity编辑器扩展 UI控件篇
  9. uniapp 手机号码登录验证
  10. 动画: 一个浏览器是如何工作的?