网页视频抓取脚本(新手学习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()

  第一次写教程文章,大部分是根据自己的理解写的。有些表达在书本上肯定不好理解,所以我应该记录下自己的学习。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线