python抓取动态网页(1.模拟用户向指定网站发送请求需要下载(图) )

优采云 发布时间: 2021-10-13 16:15

  python抓取动态网页(1.模拟用户向指定网站发送请求需要下载(图)

)

  1.模拟用户向指定的网站发送请求

  需要下载requests模块,模拟用户向网站发送请求,在终端输入如下命令:

  pip install requests

  1> 了解网页的结构

  学习网页基础知识(通常由HTML(基本网页骨架)、CSS(页面样式)、JS(与用户动态交互)三部分组成)

  2> 了解爬虫

  网络爬虫(也称为网络蜘蛛)是一种按照一定的规则自动抓取万维网上信息的程序或脚本。其他不太常用的名称是蚂蚁、自动索引、模拟器或蠕虫。其实通俗的讲就是通过程序获取网页上你想要的数据,也就是自动抓取数据

  3>了解防爬

  搜索引擎可以使用爬虫来抓取网页信息,进行数据分析等,但是网站中的一些网页信息是不想被抓取的。涉及到反爬虫技术。

  反爬虫技术如下:

  1. 通过user-Agent控制访问(user-agent使服务器能够识别用户的操作系统和版本,cpu类型,浏览器类型和版本,有的网站会设置user-agent列表范围,范围内可以正常访问),2.受IP限制,3.设置请求间隔,4.自动化测试工具,5.参数通过加密,6.@ > 使用robots.txt 限制爬虫等。

  2.分析网页数据

  requests库已经可以抓取网页的源代码了,接下来我们需要从源代码中查找并提取数据。Beautiful Soup 是一个 Python 库,其主要功能是从网页中抓取数据。Beautiful Soup 已经移植到 bs4 库中,这意味着您需要在导入 Beautiful Soup 之前安装 bs4 库。

  安装完bs4库后,还需要安装lxml库。如果我们不安装 lxml 库,我们将使用 Python 的默认解析器。虽然 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器,也支持一些第三方解析器,但 lxml 库功能更强大,速度更快,所以我个人建议安装 lxml 库。

  pip install bs4

pip install lxml

  3.代码部分

  1> 抓取图片网站的具体代码如下:

  # pip install requests

import requests

#pip install bs4 用BeautifulSoup来对HTML文档进行解析

from bs4 import BeautifulSoup

class spider():

def __init__(self,url):

#请求网址

self.url = url

#设置请求头

self.headers = {"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36"}

def get(self):

# 通过请求获取响应数据(此数据是html文本格式的数据)

res = requests.get(self.url,headers=self.headers)

html = res.text

# 解析数据

info = BeautifulSoup(html, "lxml")

# 使用select选择器定位数据

data = info.select("#thumbs > section > ul > li > figure > img")

# 在解析后的数据中通过遍历的方法提取图片的url存入列表中,得到一个urllist列表

urllist = []

for i in data:

urllist.append(i.get("data-src"))

# 通过解析后的url再次发送请求获取图片

for j in urllist:

pictureurl = j

# 图片命名

name = pictureurl.split("/")[-1]

response = requests.get(url=pictureurl, headers=self.headers)

# 以二进制数据流的方式写入指定目录文件

with open("D:\spiderPicture\%s" % name, "wb") as f:

f.write(response.content)

sp = spider("https://wallhaven.cc/search?q=id:711&sorting=random&ref=fp")

sp.get()

  2> 详细代码

  封装了代码,方便批量抓取。首先,导入两个包:requests 和 BeautifulSoup。Requests 是模拟用户向浏览器发送请求,而 BeautifulSoup 是抓取网页中的数据。

  url 是目标 URL:

  

  设置请求头:

  

  在请求标头中找到用户代理并复制和粘贴

  #设置请求头

self.headers = {"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36"}

  发送请求获取响应数据:(这里html为HTML文本数据)

   # 通过请求获取响应数据(此数据是html文本格式的数据)

res = requests.get(self.url,headers=self.headers)

html = res.text

  通过BeautifulSoup解析数据:(BeautifulSoup的第一个参数是要解析的数据,第二个参数是解析的方式)

  # 解析数据

info = BeautifulSoup(html, "lxml")

  使用select选择器定位数据(我们需要图片的url来抓取图片,所以我们需要定位到url)

  

  复制选择器所在的位置:

  

  复制选择器得到:

  #thumbs > section > ul > li:nth-child(1) > figure > img

  但这只是一张图片,我们要的是当前页面的所有图片,所以这里需要改一下(删除li::后的第n个子(1)):

  #thumbs > section > ul > li > figure > img

  # 使用select选择器定位数据

data = info.select("#thumbs > section > ul > li > figure > img")

  数据输出的结构如下:

  

  得到图片地址后:新建一个列表,把所有的URL都加入列表中

  # 在解析后的数据中通过遍历的方法提取图片的url存入列表中,得到一个urllist列表

print(data)

urllist = []

for i in data:

urllist.append(i.get("data-src"))

  名单如下:

  

  再次发送请求,通过解析后的url获取图片。图片名称是通过将url地址字符串分割成片的方式分配给名称,最后以二进制方式写入指定目录。

  # 通过解析后的url再次发送请求获取图片

for j in urllist:

pictureurl = j

# 图片命名

name = pictureurl.split("/")[-1]

response = requests.get(url=pictureurl, headers=self.headers)

# 以二进制数据流的方式写入指定目录文件

with open("D:\spiderPicture\%s" % name, "wb") as f:

f.write(response.content)

  查看结果:

  

  批量抓取另一张网站图片的源码如下:

  # pip install requests

import requests

#pip install bs4 用BeautifulSoup来对HTML文档进行解析

from bs4 import BeautifulSoup

class spider():

def __init__(self,url):

#请求网址

self.url = url

#设置请求头

self.headers = {"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36"}

def get(self):

# 通过请求获取响应数据(此数据是html文本格式的数据)

res = requests.get(self.url,headers=self.headers)

html = res.text

# 解析数据

info = BeautifulSoup(html, "lxml")

# 使用select选择器定位数据

data = info.select("#main > div.slist > ul > li > a > img")

# 在解析后的数据中通过遍历的方法提取图片的url存入列表中,得到一个urllist列表

print(data)

urllist = []

for i in data:

urllist.append(i.get("src"))

print(urllist)

# 通过解析后的url再次发送请求获取图片

for j in urllist:

pictureurl = j

# 图片命名

# name = pictureurl.split("/")[-1]

response = requests.get(url="https://pic.netbian.com"+pictureurl, headers=self.headers)

# 以二进制数据流的方式写入指定目录文件

global number

with open("D:\spiderPicture\pic\%d.jpg" % number, "wb") as f:

f.write(response.content)

number += 1

i = 3

number = 1

while 1:

url = "https://pic.netbian.com/4kmeinv/index_%d.html"%i

sp = spider(url)

sp.get()

i += 1

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线