新手学习Python爬虫之Request和beautifulsoup

Created: Apr 13, 2020 2:45 PM

学了一下爬虫基本原理,利用request和beautiful soup爬了最简单的网页。为了巩固学到的东西,写了一篇总结:

首先,说一下我现在能爬的这些网页的基本特点:

  1. 在Network中,文档类型为document的请求响应中可以找到需要爬取的所有内容。
  2. 不需要登陆等POST操作就可以得到需要的信息

这类网页的爬取方法很有规律,变化也不多,总结下来就是这几个步骤:

  1. 利用request库发送请求,得到响应,即网页源代码
  2. 利用解析库(我用的是BeautifulSoup)按需解析网页,得到我们需要的信息
  3. 将信息按照我们需要的格式保存

详细的方法说明

建议配合下方代码一起食用

  1. 首先打开Network,清空响应,刷新后在Network中找出Type为document的响应,这就是网页源代码
  2. 点击Headers,复制User-Agent并写在header里(具体操作看下面的代码),告诉网站访问者请求的工具,让网站不会认为我们是在爬虫而是在用浏览器访问。
  3. 点击Response,在源代码中搜索我们想要找的部分,了解他们对应的DOM结构是怎么样的。(关于DOM的东西不写啦,自己可以搜索)
  4. 写请求函数,得到网页源代码
  5. 根据网页源代码和我们需要的信息的DOM结构,按需解析。

放一下代码,再来讲每段代码对应的特色部分:

站酷网批量下载图片

URL:https://www.zcool.com.cn/work/ZNDQzMjAwNjA=.html

我爬取站酷网的起因是站酷网中,有些作品因为作者的版权原因禁止保存。简单的方法是可以通过浏览器审查元素的方式找到相应链接,点开挨个保存,但是这样太麻烦了,就想写一个可以通过输入站酷帖子详情页url的方法快速批量保存。

脚本使用方法: 修改URL链接后运行,就会批量保存图片

使用效果图:

站酷网结构很整齐,所以也很容易找到图片url的位置很容易保存

不足的是,这个是最早写的一份代码,当时对这两个库理解都不深,代码结构写的很差。

 from bs4 import BeautifulSoupimport requestsURL = 'https://www.zcool.com.cn/work/ZNDQyNTQ1OTI=.html'html = requests.get(URL).textsoup = BeautifulSoup(html)img_ul = soup.find_all('div', {"class": "reveal-work-wrap"})print(type(img_ul))for ul in img_ul:imgs = ul.find_all('img')for img in imgs:url = img['src']r = requests.get(url,stream='True')image_name = url.split('/')[-1]with open('./img/%s' % image_name, 'wb') as f:for chunk in r.iter_content(chunk_size=128):f.write(chunk)print('Saved %s' % image_name)

抓取微博热搜

URL:https://s.weibo.com/top/summary

这个是看到教程里面有教你抓取猫眼电影的,我本来想照着写,奈何猫眼电影现在需要验证码了,我还不太会,所以换了微博热搜来爬

这个脚本没有写输出到文件,简单的输出到控制台先看看效果:



这次写的时候学着更加模块化地定义每个函数,虽然我本人觉得我写C/C++的时候模块化做的还是很好的,但是感觉python是一种很繁华浮躁的脚本语言,所以总是在开始的时候很难静下心来想想怎么模块化。

思路同样很简单,把请求网页写为了一个函数,解析网页写成了一个函数。

在解析网页时,写微博热搜包括后面两段代码时我都遇到了一个问题,就是不知道soup中某些方法在使用过后返回值是什么。我的解决方法是经常使用**type()**函数来查看变量类型。

    import requestsfrom bs4 import BeautifulSoup def get_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/80.0.3987.163 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn None

    def find_hot(html):soup = BeautifulSoup(html, "html.parser")hot_text1 = soup.find_all('td')list = []for i in hot_text1:text_all = i.find_all('a', {'target': "_blank"})if text_all != []:list.append(text_all)return list​    def split(list):i = 0for item in list:i += 1print(i, item[0].string)​    def main():url = 'https://s.weibo.com/top/summary/'html = get_one_page(url)list = find_hot(html)split(list)​    main()

抓取油猴脚本以及每个脚本的当日安装数和总安装数,并保存至csv文件

URL:https://greasyfork.org/zh-CN/scripts

这个脚本我主要是想试着抓取多个信息,最开始没想到抓什么,就在收藏夹里面看到了油猴脚本,这个网站不仅是信息列表形式,而且信息的维度很多,适合练习。

我从这些信息中选择了标题+今日安装数+总安装数抓取,抓取效果保存在csv文件中:

这个脚本稍微详细说下:

这是我从源代码中复制出的一条,对应的是第一条油猴脚本的信息:

<li data-script-id="370634" data-script-name="懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、百度网盘直接下载、知乎视频下载等多合一版。长期更新,放心使用。" data-script-authors="{&quot;198522&quot;:&quot;懒蛤蛤&quot;}" data-script-daily-installs="8167" data-script-total-installs="1723254" data-script-rating-score="98.4" data-script-created-date="2018-07-27" data-script-updated-date="2020-04-08" data-script-type="public" data-script-version="2.3.2" data-sensitive="false" data-script-language="js" data-css-available-as-js="false"><article><h2><a href="/zh-CN/scripts/370634-%E6%87%92%E4%BA%BA%E4%B8%93%E7%94%A8-%E5%85%A8%E7%BD%91vip%E8%A7%86%E9%A2%91%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3%E5%8E%BB%E5%B9%BF%E5%91%8A-%E5%85%A8%E7%BD%91%E9%9F%B3%E4%B9%90%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD-%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E7%9B%B4%E6%8E%A5%E4%B8%8B%E8%BD%BD-%E7%9F%A5%E4%B9%8E%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E7%AD%89%E5%A4%9A%E5%90%88%E4%B8%80%E7%89%88-%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0-%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8">懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、百度网盘直接下载、知乎视频下载等多合一版。长期更新,放心使用。</a><span class="name-description-separator">-</span><span class="description">自用组合型多功能脚本,集合了优酷、爱奇艺、腾讯、芒果等全网VIP视频免费破解去广告,网易云音乐、QQ音乐、酷狗、酷我、虾米、蜻蜓FM、荔枝FM、喜马拉雅等网站音乐免客户端下载,百度网盘直接下载,知乎视频下载,优惠券查询等几个自己常用的功能。</span></h2><dl class="inline-script-stats"><dt class="script-list-author"><span>作者</span></dt><dd class="script-list-author"><span><a href="/zh-CN/users/198522-%E6%87%92%E8%9B%A4%E8%9B%A4">懒蛤蛤</a></span></dd><dt class="script-list-daily-installs"><span>今日安装</span></dt><dd class="script-list-daily-installs"><span>8,167</span></dd><dt class="script-list-total-installs"><span>总安装量</span></dt><dd class="script-list-total-installs"><span>1,723,254</span></dd><dt class="script-list-ratings"><span>得分</span></dt><dd class="script-list-ratings" data-rating-score="98.4"><span><span class="good-rating-count" title="好评或收藏的人数。">1868</span>
<span class="ok-rating-count" title="评级为一般的人数。">20</span>
<span class="bad-rating-count" title="评级为差评的人数。">10</span>
</span></dd><dt class="script-list-created-date"><span>创建日期</span></dt><dd class="script-list-created-date"><span><time datetime="2018-07-27T02:35:32+00:00">2018-07-27</time></span></dd><dt class="script-list-updated-date"><span>最近更新</span></dt><dd class="script-list-updated-date"><span><time datetime="2020-04-08T02:51:30+00:00">2020-04-08</time></span></dd></dl></article>

可以看到标题位于li标签的data-script-name属性下,所以我们首先用find_all()找出所有li标签。

接着,我们可以在这些li标签下,通过get找出所有data-script-name的值,就是脚本的标题

值得一提的是,用find_all()得到的结果是一个结果集,如果要继续使用soup中的方法,需要便利集合中的元素来使用这些方法。

还有,在将中文保存到csv的时候,如果不使用encoding=‘utf_8_sig’,则会在用excel打开文件时出现乱码。

    import requestsimport csvfrom bs4 import BeautifulSoupurl = 'https://greasyfork.org/zh-CN/scripts'​    def get_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/80.0.3987.163 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn None​    def find_name(response):soup = BeautifulSoup(response, "html.parser")info = soup.find_all('li')list = []with open('data.csv', 'w', encoding='utf_8_sig') as csvfile:writer = csv.writer(csvfile)writer.writerow(['text', 'daily_install', 'total_instal'])# print(info)for i in info:name = i.get('data-script-name')daily_install = i.get('data-script-daily-installs')tot_install = i.get('data-script-total-installs')if (name):writer.writerow([name, daily_install, tot_install])templist = [name, daily_install, tot_install]print(templist)list.append(templist)return list​    def main():response = get_one_page(url)soup = find_name(response)# print(soup)​    main()

抓取GitHub TrendingList的仓库名,Star数和Fork数并保存至csv文件

URL:https://github.com/trending

GitHub TrendingList和上一个油猴脚本的抓取比较类似。抓取这个的灵感来源于一个人给我发了邮件说在GitHub上抓到了我的信息,我就想也抓一抓这些大佬仓库。

抓取到的结果也是保存在了csv文件中:

这次我是在解析网页之后,分别写了三个函数来提取他们的仓库名、Star数、Fork数,然后合并三列输入进csv文件,这种做法的缺点就是需要保证这三个数组的长度相等,数据一一对应才能保证是正确的。不过网页结构肯定会保证这一点的,好像也没什么不好。

因为我不太熟练正则表达式,所以写出来的代码效率比较低,初学者将就看看吧

值得一提的是,Star和Fork数除了对应svg不一样外,其他都一样,所以我只能采用把他们分开写在两个函数中,然后提取父节点的text这种下策,效率属实比较低。

    import requestsimport csvfrom bs4 import BeautifulSoupurl = 'https://github.com/trending'​    def get_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/80.0.3987.163 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn None​    def find_name(soup):namelist = []h1 = soup.find_all('h1')for e_h1 in h1:a = e_h1.find_all('a')for e_a in a:name = e_a.get_text().replace('\n', '').replace(' ', '')namelist.append(name)return namelist​    def find_star(soup):star = []star_fork = soup.find_all('a', {'class': 'muted-link'})for e_s_f in star_fork:e_star = e_s_f.find('svg', {'aria-label': 'star'})if e_star:e_star = e_star.find_parent().get_text().replace('\n', '').replace(' ', '')star.append(e_star)return star​    def find_fork(soup):fork = []star_fork = soup.find_all('a', {'class': 'muted-link'})for e_s_f in star_fork:e_fork = e_s_f.find('svg', {'aria-label': 'fork'})if e_fork:e_star = e_fork.find_parent().get_text().replace('\n', '').replace(' ', '')fork.append(e_star)return fork​    def main():response = get_one_page(url)soup = BeautifulSoup(response, "html.parser")namelist = find_name(soup)star = find_star(soup)fork = find_fork(soup)print(len(namelist), len(star), len(fork))rows = zip(namelist, star, fork)with open('github.csv', 'w') as f:writer = csv.writer(f)writer.writerow(['Developer/Repo', 'Star', 'Fork'])for row in rows:writer.writerow(row)​    main()

第一次写教程性的文章,大部分都是基于自己的理解写的,有的表述肯定没有书上容易懂,就当记录一下自己的学习。

新手Python爬虫教学(Request+BeautifulSoup)相关推荐

  1. 不跳步骤的新手python爬虫教程(一)

    代码不是看出来的,而是敲出来的,建议关注公众号,收藏教程,跟着步骤练习爬虫,成为真正的Spider Man. Python同C.Java一样都是计算机程序设计语言,python语言作为高级语言可以写网 ...

  2. 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导

    爬虫是大家公认的入门Python最好方式,没有之一.虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就能实现基本的爬虫,零基础也能快速入门,让新手小白体会更大的成 ...

  3. 【Python爬虫教学】百度篇·手把手教你抓取百度搜索关键词后的页面源代码

    [开门见山] 最近整理了下之前做过的项目,学的东西不少,乱七八糟.打算写点关于 Python 爬虫的东西,新人一枚,还望大佬们多多担待,别把我头给打歪了. 前面我先磨叽磨叽些基础的东西,对爬虫新人友好 ...

  4. Python爬虫:Selenium+ BeautifulSoup 爬取JS渲染的动态内容(雪球网新闻)

    最近要有一个任务,要爬取https://xueqiu.com/#/cn 网页上的文章,作为后续自然语言处理的源数据. 爬取目标:下图中红色方框部分的文章内容.(需要点击每篇文章的链接才能获得文章内容) ...

  5. Python爬虫:用BeautifulSoup进行NBA数据爬取

    爬虫主要就是要过滤掉网页中没用的信息.抓取网页中实用的信息 一般的爬虫架构为: 在python爬虫之前先要对网页的结构知识有一定的了解.如网页的标签,网页的语言等知识,推荐去W3School: W3s ...

  6. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  7. python爬取率_[新手]python爬虫爬取中证指数官网数据

    想用python爬虫获取中证指数官网上的几个主要指数的每日估值更新,但是下载下来的页面内容却没有想要的数据.想要的数据前面有个JavaScript标签,是不是光靠python没办法获取这个数据?求大神 ...

  8. python爬取javascript变量数据_javascript - [新手]python爬虫爬取中证指数官网数据

    问 题 想用python爬虫获取中证指数官网上的几个主要指数的每日估值更新,但是下载下来的页面内容却没有想要的数据.想要的数据前面有个JavaScript标签,是不是光靠python没办法获取这个数据 ...

  9. 新手python爬虫100个入门项目

    前言 1.断点续爬并存入MySQL (文末送读者福利) 2.秒爬,python爬虫中的多线程,多进程,协程 3.抓取百度图片唯美意境模块 4.抓取百度贴吧某话题下的所有图片 5.淘宝模拟登录 6.天猫 ...

最新文章

  1. SQLAlchemy按降序排列?
  2. 网站优化工作关键——稳定排名!
  3. Oracle的SOME,ANY和ALL操作
  4. java中处理字符编码(网页与数据库)(转)
  5. python求字符串的所有子集_打印一字符串的所有子集 | 学步园
  6. java吃货联盟系统源码_小项目,吃货联盟,java初级小项目,源代码
  7. hue 用oozie调度shell(sqoop)脚本问题
  8. [论文写作笔记] C11论文查重原理及降重
  9. cad四级计算机考试,国家CAD等级考试介绍
  10. 37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项
  11. 地市级公安局实战通信指挥调度方案
  12. Ubuntu 的千千静听
  13. java邮件群发代码_基于jsp的邮件群发系统-JavaEE实现邮件群发系统 - java项目源码...
  14. 经典拼数字游戏NumPuzzle C# By Red_angelX
  15. 【怀旧】80后,难忘童年----100部最经典的电视连续剧
  16. Android音频子系统(十一)------耳机返听(耳返)原理实现
  17. origin Pro 9.0画多条三维折线图(此处以两条为例)
  18. Instagram 工程的3条规则: 可扩展的云应用架构
  19. 北京神州泰岳软件股份有限公司java笔试题
  20. 博客摘录「 项目启动会ppt_“项目启动会”必须要汇报的18个要素(附PPT模板)| 推荐」2023年5月26日转载自:http://t.csdn.cn/z5xg8

热门文章

  1. ios 7 Launch Images改变屏幕尺寸
  2. SQL SERVER 2005数据导入导出报“错误 0xc00470fe 数据流任务 产品级别对于 组件“源 - TestDB01$”(1) 而言不足”
  3. 云师大计算机宿舍,云南师范大学宿舍条件、住宿好吗、寝室情况
  4. ieee 802.1
  5. halt ,poweroff和shutdown 的区别
  6. SQL SERVER2000免安装版 下载
  7. 「巨杉学」开展大数据金融人才培养模式探索课题培训
  8. 把本地文件和文件夹提到公司的gitlab上
  9. Linux:刻录u盘,格式化u盘
  10. 全球大学计算机人工智能排名,全球大学计算机实力排名:清北人工智能内地前二...