虽然这是一个小爬虫,但所用到库还真不少,比如,requests,lxml,os,re等
下面先把源代码献上:
‘’’
import requests
from lxml import etree
import time
import os
import re
def parse_page(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'
}
# proxy = {"http": "120.27.199.129:8089"}
response = requests.get(url, headers=headers)
text = response.content.decode()
html = etree.HTML(text)
imgs = html.xpath('//li[@class="list-group-item"]//img[@class!="gif"]') # 以图片分组
for img in imgs:
img_url = img.get('data-backup') # 获取图片链接
alt = img.get("alt") # 获取图片名称
alt = re.sub(r'[\.。\??!,,\*]', "", alt) # 去除标题中的特殊字符
last = os.path.splitext(img_url)[1] # 获取图片名称后缀
file_name = alt + last # 组合成图片名称
print(file_name)
img_res = requests.get(img_url)
if img_res.status_code == 200:
with open(os.path.join(r".\images", file_name), 'wb') as f:
f.write(img_res.content)
# request.urlretrieve(img_url, "images/"+file_name)
def main():
for x in range(1, 101):
url = 'http://www.doutula.com/photo/list/?page=%d' % x
parse_page(url)
time.sleep(3) # 等待页面加载数据
if __name__ == '__main__':
main()
程序运行之后的效果如下:
1.问题: 再图片列表分组时,由于自己的粗心, 将带有gif的图片也混进去了,导致后面的所爬取出来的数据不准确
解决方法:只需要将xpath语法修改一下即可,如下:
imgs = html.xpath(’//li[@class=“list-group-item”]//img[@class!=“gif”]’)
2.问题: 在数据存储时,我本来想用urllib库下的request.urlretrieve(img_url, “images/”+file_name)来存储图片,但不知道为何,在运行爬虫时服务器会报出:403错误,也就是拒绝访问权限。最开始我还以为自己的ip被封了,然后还去找了几个代理ip,还添加了cooikes参数,但是还是不能访问.,这也耗费了我一些时间。
解决方法:换一种思路存储数据,使用 with open()的方式以二进制存储文件,代替 request.urlretrieve(img_url, “images/”+file_name)这种方法, 代码如下:
img_res = requests.get(img_url)
if img_res.status_code == 200:
with open(os.path.join(r".\images", file_name), ‘wb’) as f:
f.write(img_res.content)
# request.urlretrieve(img_url, “images/”+file_name)
此刻“斗图啦”网站爬虫就算完美解决啦,以上有不足之处,欢迎各位朋友指出,万分感谢!