网页爬虫抓取百度图片(2.如何用python请求一个网页的过程分析(组图))

优采云 发布时间: 2021-10-24 02:07

  网页爬虫抓取百度图片(2.如何用python请求一个网页的过程分析(组图))

  我第一次遇到lxml库1.什么是爬虫?

  所谓爬虫就是按照一定的规则自动从互联网上抓取信息的程序或脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是它上面的蜘蛛,不断地爬取我们需要的信息。

  2.履带三要素3.履带过程分析

  当一个人访问一个网页时,它是如何进行的?

  ①打开浏览器,输入要访问的URL,发起请求。

  ②等待服务器返回数据,通过浏览器加载网页。

  ③从网页中查找您需要的数据(文本、图片、文件等)。

  ④保存您需要的数据。

  对于爬虫来说,同样如此。它模仿了人类请求网页的过程,但略有不同。

  首先,对应上面的步骤①和②,我们需要使用python来实现请求一个网页的功能。

  其次,对应上面的步骤③,我们需要使用python来实现解析请求网页的功能。

  最后,对于上面的步骤④,我们需要使用python来实现保存数据的功能。

  因为是一个简单的爬虫,其他一些复杂的操作这里就不赘述了。下面,对以上功能一一分析。

  4.如何用python请求一个网页

  作为拥有丰富类库的编程语言,使用python请求网页完全是小菜一碟。这里有一个非常有用的类库 urllib.request。

  如何模拟用户请求,请看我的另一篇博客:

  4.1. 抓取网页

  import urllib.request

response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')

print(response.read().decode('utf-8'))

  这样就可以抓取csdn我主页的html文档了

  当我们使用爬虫时,我们需要从网页中提取我们需要的数据。接下来,我们来学习抓取百度搜索页面的热门列表数据。

  

  4.2.如何解析网页

  使用 lxml 库

  lxml 是一个用 Python 编写的库,可以快速灵活地处理 XML 和 HTML。

  它支持 XML 路径语言 (XPath) 和可扩展样式表语言转换 (XSLT),并实现了通用的 ElementTree API。

  安装

  #pip方式安装

pip3 install lxml

#wheel方式安装

#下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl

  yum install -y epel-release libxslt-devel libxml2-devel openssl-devel

pip3 install lxml

  环境/版本列表:

  4.3.写代码

  import urllib.request

from lxml import etree

# 获取百度热榜

url = "https://www.baidu.com/s?ie=UTF-8&wd=1"

# 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问

req = urllib.request.Request(url=url, headers={

'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

})

# 发起请求

html_resp = urllib.request.urlopen(req).read().decode("utf-8")

  在这里我们可以顺利获取到百度搜索页面的html文档

  我们需要看看热搜排名的标签元素在哪里

  

  

  找到第一个右键复制XPath(后来的XPath是什么)

  

  我们需要了解和使用XPath。XPath 是 XML Path Language,它是一种用于确定 XML 文档某部分位置的语言。

  复制内容的结果是://*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]

  这个xPath字符串表示当前在html中的位置是热点新闻的第一行

  5.XPath 常用规则

  表达

  描述

  节点名

  选择该节点的所有子节点

  /

  从当前节点中选择直接子节点

  //

  从当前节点中选择后代节点

  .

  选择当前节点

  ..

  选择当前节点的父节点

  @

  选择属性

  *

  通配符,选择所有元素节点和元素名称

  @*

  选择所有属性

  [@atrib]

  选择具有给定属性的所有元素

  [@atrib='value']

  选择具有给定值的给定属性的所有元素

  [标签]

  选择具有指定元素的所有直接子节点

  [标签='文本']

  选择所有指定元素,文本内容为文本节点

  6.继续分析

  那么,当我们想要获取所有热门新闻时,我们该如何写作呢?

  继续看网页

  

  可以看到所有的热榜都在三个以下

  修改刚刚复制的XPath

  //*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1] 改为 //*[@id="con-ar"]/ div[2]/div/div/table/tbody/tr

  这样XPath就会定位到这三个tbody下的所有tr元素内容

  继续看看tr是不是我们想要的,展开一个tr看看

  

  甘~还有一堆,百度,你不讲武道,

  

  这该怎么做。我们需要获取的数据是【标题】【访问链接】【热度】,现在tr元素全部到手了

  然后直接从tr开始获取下面所有标签的标题和超链接

  标题的 XPath:*/a/@title 超链接的 XPath:*/a/@href

  *表示匹配tr/a下的所有元素都在*找到第一个a标签@是属性选择器标题,href是要选择的元素属性

  还在发烧,让我继续操作,直接选择tr下的第二个td XPath:td[2]

  分析完成后贴出完整代码

  import urllib.request

from lxml import etree

# 获取百度热榜

url = "https://www.baidu.com/s?ie=UTF-8&wd=1"

# 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问

req = urllib.request.Request(url=url, headers={

'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

})

html_resp = urllib.request.urlopen(req).read().decode("utf-8")

html = etree.HTML(html_resp)#初始化生成一个XPath解析对象

_list = html.xpath("//*[@id='con-ar']/div[2]/div/div/table/tbody/tr")

print(f"article count : {len(_list)}")

for tr in _list:

title = tr.xpath("*/a/@title")[0] # 获取url的title

href = tr.xpath("*/a/@href")[0] # 获取url的href

hot = tr.xpath("string(td[2])").strip() # 获取热度

print(f"{hot}\t{title}\thttps://www.baidu.com{href}")

  单击运行,程序运行。很快,所有的数据都来了,我把它们都抓住了。我笑了。希望百度鼠标能做到

  

  这样就完成了lxml xpath 的基本使用。更详细的xpath教程,请看:

  7.存储数据

  存入数据后立即修改代码

  print(f"article count : {len(_list)}")

with open('g_data.text', 'w') as f: # 在当前路径下,以写的方式打开一个名为'g_data.text',如果不存在则创建

for tr in _list:

title = tr.xpath("*/a/@title")[0] # 获取url的title

href = tr.xpath("*/a/@href")[0] # 获取url的href

hot = tr.xpath("string(td[2])").strip() # 获取热度

line = f"{hot}\t{title}\thttps://www.baidu.com{href}\n"

f.write(line) # 写入文件

  

  8.补充

  东西虽然不多,但是写了好久。这是我自己的学习总结,希望对大家有帮助。我只是一个菜鸟。你可以直接指出文章中的错误。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线