java爬虫抓取动态网页(2.动态网页:不只有代码写出的网页被称为动态)

优采云 发布时间: 2022-03-27 06:19

  java爬虫抓取动态网页(2.动态网页:不只有代码写出的网页被称为动态)

  T小昂仔 11月26日

  

  版本:python3.7

  编程软件:sublime

  爬取信息是一个很大的需求,从单个页面、某个站点,到搜索引擎(百度、谷歌)的全网爬取。只要人能看到东西,理论上爬虫就可以获取。不管是静态页面还是动态页面。不管是PC端的页面,还是移动端的APP。爬虫,有多种语言可供选择,python、php、go、java……甚至c。但现在主流是python作为爬虫编程语言,因为它好用、高效、省时。

  爬取网页信息的python库有很多,urllib、urllib2(python3不再使用)、requests。我们先比较一下它们的区别:

  urllib和urllib2是python标准库,即如果你已经安装了python,这两个库可以直接使用;requests是第三方库,不是python基金会实现的,但是很强大。

  但是 urllib 和 urllib2 都是通过 url 来打开资源的。其中 urllib 只能接受 url,但同样伪装请求的 headers。这样写的爬虫发出的请求会被很多网站直接拦截,伪装不好。嗯,它需要很复杂的修改,在之前的文章中已经介绍过了。

  requests 库可以实现 urllib 和 urllib2 的所有功能,并且有它们不具备的优点。在使用过程中,请求更有用。

  1:什么是静态网页和动态网页?

  1.静态网页:通俗地说,只有 HTML 格式的网页通常被称为静态网页。这些网页的数据比较容易获取,因为所有的数据都显示在网页的HTML代码中。在用python进行爬虫的过程中,有一个强大的Request库可以方便的为我们发送HTTP请求来爬取静态网页。

  2.动态网页:不仅HTML代码编写的网页称为动态网页,这些网页一般由CSS、JavaScript代码和HTML代码共同组成。在代码中,这需要复杂的操作。

  二:静态网页爬取

  1.请求安装和简单操作

  (1)安装

  在 cmd 或终端中写入

  pip install requests

  而已。

  (2)获取网页内容'

  Request 最常用的功能是获取网页的内容。我们首先获取上一篇博客的内容:

  import requests

rr = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139')

print("文本编码为:",rr.encoding)

print("响应状态码为:",rr.status_code)

print("内容字符串为:",rr.text)

  这样就返回了一个名为rr的响应对象,我们可以调用相应的函数来获取需要的信息。结果如下所示:

  

  ...

  

  以下是一些基本方法:

  print(response.status_code) # 打印状态码,200表示请求成功;4xx表示客户端错误;5xx表示服务器错误响应

int(response.url) # 打印请求url

print(response.headers) # 打印头信息

print(response.cookies) # 打印cookie信息

print(response.text) #以文本形式打印网页源码

print(response.content) #以字节流形式打印

  您还可以使用 response.json(),它是 Response 中内置的 JSON *敏*感*词*。

  2.自定义请求

  现在我们可以爬取网页的html代码数据了,但是有时候我们只需要一部分数据,那么就需要设置Requests的参数来获取我们需要的数据,包括传递URL参数、自定义请求头、发送POST 请求、设置超时等。

  这些操作解释如下:

  (1)传递 URL 参数

  为了请求特定的数据,我们需要在 URL 的查询字符串中添加一些特定的数据。该数据通常后跟一个问号,并作为键值对放置在 URL 中。

  在 Request 中,我们可以直接将这些参数保存在字典中,并使用 params 构建到 URL 中。

  这是一个例子:

  import requests

key_dict = {'one':'value1','two':'value2'}

rr = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139',params = key_dict)

print("URL正确编码为:",rr.url)

print("字符串方式的响应的内容是:",rr.text)

  让我们看看结果:

  

  (2) 自定义请求头

  请求标头提供有关请求、响应或其他发送实体的信息。如果没有自定义请求头或者请求的请求头与实际网页不一致,可能无法返回正确的结果。请求不会根据自定义的请求头改变自己的行为,只有在最终的请求中,才会传入请求头的信息。

  我们可以根据以下方法找到正确的请求头:

  打开上一篇博客的内容:

  

  然后我们右键,选择inspect(有些浏览器也叫inspect elements),然后选择Network选项:

  当我们选择python图片的时候,会发现在左边的资源栏中截取了一个文件,就是图片文件。我们可以在Header中看到Request Headers的详细信息(其实在之前的博客中已经介绍过了),这里只需要提取请求头的重要部分,即user-agent部分:

  

  然后我们将自定义请求头添加到 requests.get() 函数中:

  import requests

headers = {

'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',

'Host' : 'https://img-blog.csdn.net/20180716181513532?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lUeGlhb2FuZ3phaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70'

}

r = requests.get('https://blog.csdn.net/ITxiaoangzai/article/details/83904139',headers = headers)

print("字符串方式的响应的内容是:",r.text)

print("响应码为:",r.status_code)

  结果如下:

  

  

  这里返回的响应码是400,说明我们的代码有误。这表明我们无法以这种方式抓取图像。关于如何正确抓取图片,我会在下面的文章中告诉你。

  3.发送 POST 请求

  除了 GET 请求之外,有时还需要发送一些以表单编码的数据。这种情况下,只需要给Request中的data参数传入一个字典,这些数据字典会在发送请求时自动编码成表单。我们在之前的文章爬取有道词典中使用了这个请求。

  4.超时

  如果在指定时间内没有响应,可以使用 Requests 设置 timeout 参数来抛出异常。

  三:抓取豆瓣百强电影片名示例

  先打开网址

  然后我们找到每个视频的 HTML 代码:

  

  在这里,我们需要的所有信息都在

  

  在这里,将 lxml 更改为 html.parse:

  import requests

from bs4 import BeautifulSoup

def getUrl():

url = "https://www.douban.com/doulist/36513321/"

headers = {

'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',

}

list = []

r = requests.get(url,headers = headers)

soup = BeautifulSoup(r.text,"html.parser")

thisUrl = soup.find_all('div',class_ = "title")

for each in thisUrl:

everyUrl = each.text.strip()

list.append(everyUrl)

print(list)

print("响应码为:",r.status_code)

def main():

getUrl()

if __name__ == '__main__':

main()

  结果如下:

  

  我们这里要爬取的是100个剧名,这里我们只得到了25个,要全部爬取,我们需要分析URL:

  发现只有start=""之后的不同,我们可以分析四次,或者用循环来做:

  import requests

from bs4 import BeautifulSoup

def getUrl():

headers = {

'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5702.400 QQBrowser/10.2.1893.400',

}

for i in range(0,4):

url = "https://www.douban.com/doulist/36513321/?start={}&sort=seq&playable=0&sub_type=".format(i*25)

list = []

r = requests.get(url,headers = headers)

soup = BeautifulSoup(r.text,"html.parser")

thisUrl = soup.find_all('div',class_ = "title")

for each in thisUrl:

everyUrl = each.text.strip()

list.append(everyUrl)

print(list)

print("响应码为:",r.status_code)

def main():

getUrl()

if __name__ == '__main__':

main()

  这里我们使用 format() 来格式化字符串(也可以使用 % 来格式化字符串),我们看看结果:

  

  在这里我们看到我们已经成功爬取了我们想要的内容。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线