新⼿Python爬⾍教学(Request+BeautifulSoup)
新⼿学习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的⽅法快速批量保存。
脚本使⽤⽅法: 修改URL链接后运⾏,就会批量保存图⽚
使⽤效果图:
站酷⽹结构很整齐,所以也很容易到图⽚url的位置很容易保存
不⾜的是,这个是最早写的⼀份代码,当时对这两个库理解都不深,代码结构写的很差。
from bs4 import BeautifulSoup
import requests
URL ='l/work/ZNDQyNTQ1OTI=.html'
html = (URL).text
soup = 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 = (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)
抓取微博热搜
这个是看到教程⾥⾯有教你抓取猫眼电影的,我本来想照着写,奈何猫眼电影现在需要验证码了,我还不太会,所以换了微博热搜来爬
这个脚本没有写输出到⽂件,简单的输出到控制台先看看效果:
shell out中文意思
这次写的时候学着更加模块化地定义每个函数,虽然我本⼈觉得我写C/C++的时候模块化做的还是很好的,但是感觉python是⼀种很繁华浮躁的脚本语⾔,所以总是在开始的时候很难静下⼼来想想怎么模块化。
思路同样很简单,把请求⽹页写为了⼀个函数,解析⽹页写成了⼀个函数。
在解析⽹页时,写微博热搜包括后⾯两段代码时我都遇到了⼀个问题,就是不知道soup中某些⽅法在使⽤过后返回值是什么。我的解决⽅法是经常使⽤**type()**函数来查看变量类型。
import requests
from 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 = (url, headers=headers)
if response.status_code ==200:
return None
def find_hot(html):
soup = BeautifulSoup(html,"html.parser")
hot_text1 = soup.find_all('td')了解plc的基本编程
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 =0
for item in list:
i +=1
print(i, item[0].string)
def main():
url ='s.weibo/top/summary/'
html = get_one_page(url)
数据库系统例子list= find_hot(html)
split(list)
main()
抓取油猴脚本以及每个脚本的当⽇安装数和总安装数,并保存⾄csv⽂件
这个脚本我主要是想试着抓取多个信息,最开始没想到抓什么,就在收藏夹⾥⾯看到了油猴脚本,这个⽹站不仅是信息列表形式,⽽且信息的维度很多,适合练习。
我从这些信息中选择了标题+今⽇安装数+总安装数抓取,抓取效果保存在csv⽂件中:
这个脚本稍微详细说下:
这是我从源代码中复制出的⼀条,对应的是第⼀条油猴脚本的信息:
<li data-script-id="370634" data-script-name="懒⼈专⽤,全⽹VIP视频免费破解去⼴告、全⽹⾳乐直接下载、百度⽹盘直接下载、知乎视频下载等多合⼀版。长期更新,放⼼使⽤。" data-script-authors="{"198522":";懒蛤蛤"}" 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-versio n="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%B D%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、荔枝F M、喜马拉雅等⽹站⾳乐免客户端下载,百度⽹盘直接下载,知乎视频下载,优惠券查询等⼏个⾃⼰常⽤的功能。
</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中的⽅法,需要便利集合中的元素来使⽤这些⽅法。
python入门教程视屏还有,在将中⽂保存到csv的时候,如果不使⽤encoding=‘utf_8_sig’,则会在⽤excel打开⽂件时出现乱码。
import requests
import csv
from bs4 import BeautifulSoup
url ='/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 = (url, headers=headers)
if response.status_code ==200:
return 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)
adverse词根记忆main()
抓取GitHub TrendingList的仓库名,Star数和Fork数并保存⾄csv⽂件
GitHub TrendingList和上⼀个油猴脚本的抓取⽐较类似。抓取这个的灵感来源于⼀个⼈给我发了邮件说在GitHub上抓到了我的信息,我就想也抓⼀抓这些⼤佬仓库。
抓取到的结果也是保存在了csv⽂件中:
这次我是在解析⽹页之后,分别写了三个函数来提取他们的仓库名、Star数、Fork数,然后合并三列输⼊进csv⽂件,这种做法的缺点就是需要保证这三个数组的长度相等,数据⼀⼀对应才能保证是正确的。不过⽹页结构肯定会保证这⼀点的,好像也没什么不好。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。