先上结果
一共爬取了700张图片,历时半分钟。
爬虫的思路往往如下:
发送请求->取得页面->解析页面->存储
这里直接上源代码,然后解释下其中我觉得很重要的地方:
import requests
from lxml import etree
def get_HTML(url):
headers = {"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
try:
r = requests.get(url,headers=headers,timeout=30)
r.raise_for_status
r.encoding = "utf-8"
return r.text
except:
return
def made_url(url):
return "http:"+ url
k = 0 #k用来个图片按顺序命名的
for i in range(1,36): #总共爬取35页,每页20张图片,一共700张
URL = "https://www.qiushibaike.com/pic/page/%d/?s=5208036"%i
html = etree.HTML(get_HTML(URL))
hrefs = html.xpath('//div[@class="thumb"]/a/img/@src') #得到所有图片地址
url_list = list(map(made_url,hrefs)) #生成标准url
n = len(url_list)
#保存图片
for i in range(n): #存储图片
with open("糗事百科_all_pics/%d.jpg"%(k+i),"wb") as f:
r = requests.get(url_list[i])
f.write(r.content)
f.close
k = k + n
print(k)
其中get_HTML() 这个函数是用来发送请求,并用来取得页面的,而made_url() 这个函数是给得到结果前面加一个"http":,这样才能生成一个完整的url链接
这个小程序当中,有几个地方要注意下:
- 1.map函数,它是python内置的函数,它的用法如下
map(f,list)
它的作用能就是将函数f作用在list中的每一个元素,并生成一个列表。很简洁很有效的一个小函数。
- 我之前写完html = etree.HTML(r.text)后,总会写一句
print(etree.tostring(html))
来看下是不是得到我想要的结果,结果每次对于中文的网站,会出现诸如“&#”这样貌似乱码的东西,这个问题一直困扰着我,查来很多的资料,也没有解决这个问题。一次偶然的机会,我在一个excel群里问这个关于爬虫的问题(是的excel群),然后有人跟我说这是网页自己原来的编码,即使tosting()显示的结果是乱码格式,也不影响xpath的爬取结果,该显示中文就是中文。所以不用纠结这个问题了。另外这件事情给我的另一个启示是要多看官方文档。
网友评论