工具:python3.8,使用urllib库和lxml库进行爬取(安装方法可以进行百度)
目标网站:http://pic.netbian.com/(为了方便理解,只获取第一页)
代码
import urllib.request as ur
from lxml import etree#使用xpath获取页面上所有的图片的url
def save(url):
#更改User-Agent来模拟浏览器登录
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
#这个User-Agent是笔者通过Chrome访问时的请求头(可能有所不同)
}
req = ur.Request(url=url, headers=headers)
#发送请求
response = ur.urlopen(url)
html = response.read()
#html的类型为bytes
return html
if __name__=='__main__':
url = 'http://pic.netbian.com/'#目标网站
html = save(url)
#将bytes的类型转换成lxml.etree._Element
html_data = etree.HTML(html)
#查找所有的图片的url,并赋值给一个数组
result = html_data.xpath('//div[3]/ul/li/a/span/img/@src')
#下载所有获取的图片(迭代)
filename = 0
for each in result:
filename = filename + 1
#保存图片
with open ( str( filename ) + '.jpg', 'wb') as f:
#str( filename ) + '.jpg'为文件的名字,'.jpg'表示为该文件为图片
img = save( url + each )
#url+each为图片的url(需要对HTML文档进行分析)
f.write( img )
代码的部分讲解
urllib中的request模块:最基本的HTTP请求模块,可以用来发送HTTP请求,并接收服务端的响应数据。(这个过程就像在浏览器地址栏输入URL,然后按Enter键一样)
urlopen函数:返回一个对象,read是这个对象的一个方法。
User-Agent的作用:浏览器通常会通过发送的HTTP请求的请求头来判断该请求是否通过浏览器访问,如果服务端没有找到请求头或请求头错误,就会拒绝用户的请求。所以可以通过Request类构造方法的headers命名参数设置HTTP请求头。
xpath的用法:先将bytes的类型转换成lxml.etree._Element在进行xpath的操作。
XPath语法规则 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选取直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
如果要选取HTML文档所有的< li >节点,可以使用’//li’。
如果要选取当前节点(< li >)下所有的< p >节点,可以使用’/p’。
如果要选取HTML文档所有的< li >节点下所有的< p >节点,可以使用’//li/p’。
如果要选取HTML文档所有的< li >节点下所有的< p >节点的herf属性,可以使用’//li/p/@herf’。
关于open打开文件的用法:
f = open('E:\python\python\test.txt', 'r')
标示符’r’表示读,这样,我们就成功地打开了一个文件。
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在。
读取文件内容
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示。
f.read()
关闭文件
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
f.close()
写入文件内容
f = open('E:\python\python\test.txt', 'w')
f.write('Hello, python!')
f.close()
补充
User-Agent如何查看:在浏览器中进入开发者模式(F12)
xpath的简单用法:使用Chrome上的XPath Helper。
快速获取目标的XPath:
结束语:笔者也是萌新,如果存在写的不对的地方,还请在评论区中指出。