网页视频抓取脚本(新手学习Python爬虫之Request和beautifulsoup和beautiful爬了最简单的网页)
优采云 发布时间: 2022-01-19 19:05网页视频抓取脚本(新手学习Python爬虫之Request和beautifulsoup和beautiful爬了最简单的网页)
初学者学习Python爬虫的Request和beautifulsoup
创建时间:2020 年 4 月 13 日下午 2:45
学习了爬虫的基本原理,使用request和美汤爬取了最简单的网页。为了巩固所学,我写了一个总结:
首先说一下我现在可以爬取的这些页面的基本特征:
在网络中,所有需要爬取的内容都可以在文档类型文档的请求响应中找到。无需登录等POST操作即可获取所需信息
这类网页的爬取方式非常规整,变化不大。总结起来,这些步骤是:
使用请求库发送请求并获取响应,即网页源码使用解析库(我使用BeautifulSoup)按需解析网页,获取我们需要的信息,并将信息保存在我们需要的格式。详细方法说明
建议用下面的代码吃
首先打开Network,清空response,刷新Network,找到Type为document的response。这是网页的源代码。点击Headers,复制User-Agent写在header中(具体操作见下面代码),并告诉网站访问者请求的工具,让网站不认为我们正在抓取,但使用浏览器访问。点击Response,在源码中搜索我们要查找的部分,了解它们对应的DOM结构是什么。(关于DOM的就不写了,可以自行搜索) 编写请求函数,获取网页源码,根据网页源码的DOM结构和我们提供的信息按需解析需要。
放上代码,然后说说每段代码对应的特征部分:
批量下载图片
网址:
我之所以爬足网,是因为原作者版权原因,足网有些作品是禁止保存的。简单的方法就是在浏览器中查看元素找到对应的链接,点击一个一个保存,但是这样太麻烦了,所以想写一个方法,可以通过输入的URL快速批量保存站酷帖详情页。
脚本使用方法:修改URL链接后运行,图片会批量保存
使用效果图:
本站酷网结构非常整齐,所以很容易找到图片url的位置,也很容易保存
缺点是这是编写的第一段代码。当时对这两个库的理解还不深入,代码结构写的很烂。
from bs4 import BeautifulSoup
import requests
URL = 'https://www.zcool.com.cn/work/ZNDQyNTQ1OTI=.html'
html = requests.get(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 = 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)
抢微博热搜
网址:
这是我在教程中看到的,教你抓猫眼的电影。本来想写的,现在猫眼电影需要验证码。我不是很擅长,所以我把微博热搜改成爬取了
该脚本不会将输出写入文件,只是输出到控制台先看看效果:
这次写的时候,我学会了更模块化地定义每个函数。虽然我觉得自己写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 = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return 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 = 0
for item in list:
i += 1
print(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文件
网址:
我主要想尝试使用此脚本捕获多条信息。一开始我没想到会抓到任何东西,所以我在我的采集夹文件夹中看到了油猴脚本。这个网站不仅是信息列表的形式,还有很多维度的信息。适合练习。
我从这个信息中选择了title + today's installs + total installs 抓取,抓取效果保存在一个csv文件中:
这个脚本更详细一点:
这是我从源码中复制的一段,对应第一个油猴脚本的信息:
懒人专用,全网VIP视频免费破解去广告、全网音乐直接下载、百度网盘直接下载、知乎视频下载等多合一版。长期更新,放心使用。
-
自用组合型*敏*感*词*脚本,集合了优酷、爱奇艺、腾讯、芒果等全网VIP视频免费破解去广告,网易云音乐、QQ音乐、酷狗、酷我、虾米、蜻蜓FM、荔枝FM、喜马拉雅等网站音乐免客户端下载,百度网盘直接下载,知乎视频下载,优惠券查询等几个自己常用的功能。
作者
懒蛤蛤
今日安装
8,167
总安装量
1,723,254
得分
1868
20
10
创建日期
2018-07-27
最近更新
2020-04-08
可以看到标题在li标签的data-script-name属性下,所以我们先用find_all()查找所有li标签。
接下来我们可以通过get在这些li标签下找到data-script-name的所有值,也就是脚本的标题
值得一提的是,用 find_all() 得到的结果是一个结果集。如果要继续使用soup中的方法,需要方便set中的元素使用这些方法。
另外,在保存中文到csv时,如果不使用encoding='utf_8_sig',用excel打开文件时会出现乱码。
import requests
import csv
from bs4 import BeautifulSoup
url = '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.text
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)
main()
获取 GitHub TrendingList 的仓库名称、Star 号和 Fork 号并保存到 csv 文件
网址:
GitHub TrendingList 类似之前的油猴脚本爬取。抓住这个的灵感来自一个给我发电子邮件说我在 GitHub 上抓住了我的信息的人,我也想抓住这些大家伙的存储库。
捕获的结果也保存在 csv 文件中:
这次在解析完网页后,写了三个函数来提取它们的仓库名、星号、分叉号,然后将三列合并到csv文件中。这种方式的缺点是需要保证三个数组的长度相等,并且可以通过一一对应的方式保证数据的正确性。但是网页的结构肯定会保证这一点,而且似乎没有任何问题。
因为我对正则表达式不是很精通,所以写的代码效率比较低。初学者会看看它。
值得一提的是,Star和Fork的数量除了对应的svg是一样的,所以我只能用最好的策略,分别写在两个函数里,然后提取父节点的文本,效率相对低的。.
import requests
import csv
from bs4 import BeautifulSoup
url = '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.text
return 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()
第一次写教程文章,大部分是根据自己的理解写的。有些表达在书本上肯定不好理解,所以我应该记录下自己的学习。