写一个简单地爬取图片的代码吧,以便下次用的时候直接调用0.0 这里选择图库 中国作为抓取页面。
import requests
from lxml import etree
import time
如果pip库慢的话可以看pip安装慢解决方法
打开控制台随便找一张图片找到他的url
发现图片在一个div里然后嵌套li/a/img,然后data-original属性的值就是图片的url。 用xpath把页面里所有的图片url保存下来。
url = 'https://www.tukuchina.cn/index.php?r=photo/channelInfo&chid=&q=%E5%8C%97%E4%BA%AC%20%E6%9C%9D%E9%98%B3%E5%8C%BA'
response = requests.get(url)
html = response.text
html = etree.HTML(html)
photo = html.xpath('//div[@class="items"]/li/a/img/@data-original')
用etree.HTML将字符串转换成_Element对象,方便后面的xpath操作
上面的photo保存的是当前页面所有图片的url,所以要循环获取每个url。 然后再用get请求图片的url。
用with open保存图片。
m = 1
for i in photo:
print(m)
res = requests.get(i)
with open('./img/img' + str(m) + '.jpg', 'wb') as f:
f.write(res.content)
m += 1
上面方法只是请求的一个页面的url,这个网站有很多页面,如果我们要爬取所有页面的图片就要知道所有页面的url
可以发现不同页面只有后面的&type=&Photo_page=不同,所以可以在一个循环里每次改变&type=&Photo_page=的值即可遍历所有页面。
while (num < 5):
if (num == 1):
url = 'https://www.tukuchina.cn/index.php?r=photo/channelInfo&chid=&q=%E5%8C%97%E4%BA%AC%20%E6%9C%9D%E9%98%B3%E5%8C%BA'
else:
url = 'https://www.tukuchina.cn/index.php?r=photo/channelInfo&chid=&q=%E5%8C%97%E4%BA%AC%20%E6%9C%9D%E9%98%B3%E5%8C%BA' + '&type=&Photo_page=' + (str)num
num += 1
因为第一页是没有后缀的所以当num == 1的时候不能加后缀
可以写一个请求头把请求伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
记得在代码里加上time.sleep设置爬取频次,不然网站可能受不了那么高频的请求。
import requests
from lxml import etree
import time
num = 1
while (num < 5):
if (num == 1):
url = 'https://www.tukuchina.cn/index.php?r=photo/channelInfo&chid=&q=%E5%8C%97%E4%BA%AC%20%E6%9C%9D%E9%98%B3%E5%8C%BA'
else:
url = 'https://www.tukuchina.cn/index.php?r=photo/channelInfo&chid=&q=%E5%8C%97%E4%BA%AC%20%E6%9C%9D%E9%98%B3%E5%8C%BA' + '&type=&Photo_page=' + str(num)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}
response = requests.get(url, headers = headers)
html = response.text
html = etree.HTML(html)
photo = html.xpath('//div[@class="items"]/li/a/img/@data-original')
m = 1
for i in photo:
print(m)
time.sleep(0.5)
res = requests.get(i)
with open('./img/img' + str(m) + '.jpg', 'wb') as f:
f.write(res.content)
m += 1
num += 1