说明:
① 爬虫十分的简答,最难的点是xpath的使用,即:如何定位到每个网页上的照片的链接。
② 谷歌浏览器xpath插件 的使用是关键
1、首先,需要在“谷歌浏览器”中安装xpath插件:安装后的效果图
//div[@class="threadlist_lz clearfix"]//a[@class="j_th_tit "]/@href
查找过程:
// “任意目录”
查找 class 属性值为 threadlist_lz clearfix 的 div 节点
在上述查到的结果下,查找 class 属性值为 j_th_tit 的 a 节点
取出 a 节点下面的 href 属性对应的值
//img[@class="BDE_Image"]/@src
查找过程:
// “任意目录”
查找 class 属性值为 BDE_Image 的 img 节点
在 img 节点下,取出 BDE_Image 属性对应的值
2、然后,安装 lxml 模块,lxml中有xpath,其中,xpath的使用方法步骤
request = urllib.request.Request(full_url) # Request
response = urllib.request.urlopen(request) # urlopen
html = response.read() # read
content = etree.HTML(html) # HTML
link_list = content.xpath('xpath匹配规则') # xpath
3、实战代码
import urllib.request
from lxml import etree
def tiebaSpider(url,beginPage,endPage):
for page in range(beginPage, endPage):
pn = (page-1)*50
fullurl = url + "&pn=" + str(pn)
# print(fullurl)
loadPage(fullurl)
def loadPage(fullurl):
request = urllib.request.Request(fullurl) # 形参:url,构造并返回一个对象Request
response = urllib.request.urlopen(request) # 形参:对象Request,返回值:服务器的一个响应
html = response.read() # read():返回值—>服务器响应的HTML的全部内容,返回类型是字符串
content = etree.HTML(html) # HTML()函数:解析HTML文档为HTML DOM模型
# xpath():返回所有匹配成功的列表集合
# —> 在一整页帖子中,查找到“每个已发帖的链接”
link_list = content.xpath('//div[@class="threadlist_lz clearfix"]//a[@class="j_th_tit "]/@href')
# print(link_list)
for link in link_list:
full_url = "https://tieba.baidu.com" + link
# print(full_url)
queryImgLink(full_url) # 从网页full_url中抓取图像保存到本地
def queryImgLink(full_url):
request = urllib.request.Request(full_url)
response = urllib.request.urlopen(request)
html = response.read()
content = etree.HTML(html)
# xpath()—> 在每个已发帖中,查找到“每个图片的链接”
link_list = content.xpath('//img[@class="BDE_Image"]/@src') # 保存了图片连接
for link in link_list:
# print(link)
save_img(link)
def save_img(link):
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"}
request = urllib.request.Request(link, headers=headers)
image = urllib.request.urlopen(request).read()
pos = link.rfind('/') # rfind 从右向左查找char
filename = link[pos+1:]
# print(filename)
with open(filename,"wb") as f:
f.write(image)
if __name__=="__main__":
url = "https://tieba.baidu.com/f"
kw = input("请输入要爬取的贴吧名:") # 获取键盘的输入数据
new_kw = urllib.parse.quote(kw) # 将url中的中文进行urlencode编码
beginPage = int(input("请输入起始页码:"))
endPage = int(input("请输入结束页码:"))
url = url + "?kw=" + new_kw + "&ie=utf-8"
# print(url)
tiebaSpider(url, beginPage, endPage) # 爬取图片
程序执行结果:
请输入要爬取的贴吧名:美女
请输入起始页码:1
请输入结束页码:2