python3爬汽车之家

记录一次python3爬汽车之家。

百度上一堆python2写的爬虫,python3的少之又少,而且由于对方网站也在更新,能用的也没有找到,于是动手写一次。

第一部分:问题代码;

第二部分:可运行代码

先上结果:

测试时间:2018年11月22日

第一部分

最开始用习惯的urllib.request包写的,但由于能力有限对python不是很了解,出了问题没有解决,问题代码如下(也望有大佬可以指点):

#-*- encoding=utf-8 -*-


import re  # 不用安装
import os  # 文件夹等的操作
import time
import urllib.request




# 根据url获取网页html内容
def getHtmlContent(url):
    page = urllib.request.urlopen(url)
    return page.read()

# 从html中解析出所有jpg图片的url
# html中jpg图片的url格式为:
def getJPGs(html):
    # 解析jpg图片url的正则
    jpgReg = re.compile(b'

原因:由于汽车之家使用的自定义字体,而且这个字体还是好几种,没法一概而论,编码还很奇怪,直接爬的时候是byte类型的数据,用正则不好匹配。当然也不是没法解决,但是实际问题中有更好的解决方案,自然选择更好的方式,就像有个电线杆挡住了你的路,你可以爬过去,当然也可以绕过去。因此直接更换解决方案,如下:

第二部分

#-*- coding=utf-8 -*-
import requests
from bs4 import BeautifulSoup
import uuid

#pageCount为总页数,-1代表未初始
pageCount = -1
#获取当前页的所有图片
def getImage(url):
    #url='http://car.autohome.com.cn/pic/series/2123-1.html'
    response=requests.get(url)
    response.encoding=response.apparent_encoding

    soup=BeautifulSoup(response.text,'html.parser')

    target = soup.find(attrs={"class":"uibox-con carpic-list03 border-b-solid"})
    li_list=target.find_all('li')

    #如果未把页数初始化
    global pageCount
    if pageCount == -1:
        pageDiv = soup.find(attrs={"class":"page"})
        a_list=pageDiv.find_all('a')
        if a_list:
            pageCount = len(a_list) - 2#获取到的为上一页,页数。。。下一页,页数为a标签的个数-2,【如果页数过多,暂未测试,可能有BUG】
        
    for i in li_list:
        a=i.find('a')
        if a:
            img = a.find('img').attrs.get('src')
            print(img)

            img_response=requests.get(url='http:'+img)
            
            file_name='F:/py/result/' + str(uuid.uuid4())+'.jpg' 
            with open(file_name,'wb')as f:
                f.write(img_response.content)
#根据baseUrl来爬取,观察发现后序页的url地址规律:url-pX.hml,X代表页数,如果是第一页则url中不包含-pX,第二页在基础上多-p2,第三页为-p3。。。
def getAll(baseUrl):
    print("正在爬第1页----------------------")
    getImage(baseUrl)
    global pageCount
    for currentPageNum in range(2,pageCount+1):
        print("正在爬第{0}页----------------------".format(currentPageNum))
        tempBase = baseUrl
        otherUrl = tempBase.replace('.html','-p{0}.html'.format(currentPageNum))
        getImage(otherUrl)
    
FirstUrl='http://car.autohome.com.cn/pic/series/2123-1.html'
getAll(FirstUrl)
    

观察发现url规则:除了第一页,都是以 "-p" + 页码数 结尾的

python3爬汽车之家_第1张图片

获取到page的div然后遍历a标签的个数获得总页数,(这里未测试其他页面,如果页面数多,不显示,可能有bug,建议通过不断下一页获取,可以免去该问题)

python3爬汽车之家_第2张图片

代码中仍存留大量的实际问题,比如如果请求1个url出了问题,后面就都没法跑下去了,可以设置重试次数和超时等待上限,此处仅为举例,当抛砖引玉了~

-----------------------------

我的环境:

python3.6.5

如果缺少依赖模块可以通过    python -m pip install 模块名               来安装,如:

python -m pip install bs4

你可能感兴趣的:(python,实用)