第一次爬虫经历和踩过的坑

时间:2022-10-26 16:42:02

背景:实习的时候就说要学爬虫,一直没有兑现。又听说了爬小说网站资源然后自己建站竟然能年入千万,虽然最后伏法了。然后又想到了可以爬爬虎扑论坛的美图,就给自己立了一个flag,年前要完成一个小爬虫,也算是为2017年做一个结尾。

业务描述:爬豆瓣2017年电影

技术:python + bs4 + urllib

源码:

import ssl
import json
from urllib import request
from bs4 import BeautifulSoup

def parse_one_page(html):
    soupHtml = BeautifulSoup(html, 'lxml')
    allFilms = soupHtml.find_all(class_ = 'pl2')
    for film in allFilms:
        filmName = film.find(class_ = '').span
        if None != filmName:
            strFileName = filmName.string
            print(strFileName)
            write_to_file(strFileName)

def write_to_file(content):
    with open('2017.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
        f.close()

def main(start):
    try:
        #处理SSL证书异常
        context = ssl._create_unverified_context()
        page = request.urlopen(r'https://movie.douban.com/tag/2017?start='+str(start)+'&type=T', context = context).read()
        page = page.decode('utf-8')
        parse_one_page(page)
    except error.HTTPError as e:
        print(e.code())
        print(e.read().decode('utf-8'))

if __name__ == '__main__':
    for i in range(0, 49):
        main(i*20)

踩过的坑:
1,安装python3版本的beautifulsoup库
解决方案:pip3 install beautifulsoup4
2,采用requests库时出现了403错误
解决方案:采用urllib库代替requests库
3,SSL证书错误
解决方案:

context = ssl._create_unverified_context()
        page = request.urlopen(r'https://movie.douban.com/tag/2017?start='+str(start)+'&type=T', context = context).read()

4,异常处理
解决方案:对返回值判断是否是空对象的处理
5,构造beautifulsoup对象时忘记指定lxml的html解析器
解决方案:soupObject = BeautifulSoup(html, ‘lxml’) 如果未指定,则默认采用soupObject = BeautifulSoup(html, ‘html.parser’)
6,对BeautifulSoup对象的理解不足