‘斗图啦’网站爬虫

目标: 爬取“斗图啦”的表情包前一百页

虽然这是一个小爬虫,但所用到库还真不少,比如,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)

此刻“斗图啦”网站爬虫就算完美解决啦,以上有不足之处,欢迎各位朋友指出,万分感谢!

你可能感兴趣的:(python)