1.1 爬虫入门介绍

网络爬虫

网络爬虫(web crawler),是按照一定的规则自动浏览万维网并获取信息的机器人程序(或脚本),曾经被广泛的应用于互联网搜索引擎,使用过互联网和浏览器的人都知道,网页中除了供用户阅读的文字信息以外,还包含了一些超链接。网络爬虫系统正式通过网页中的超链接信息不断获取网络上的其他页面。

网络爬虫的相关工具

1、Chrome Developer Tools:谷歌浏览器内置的开发者工具

2、POSTMAN:强大的网页跳是与RESTful请求工具

3、HTTPie:命令行HTTP客户端

4、BuiltWith:识别网站所用技术的工具

5、python-whois:查询网站所有者的工具

6、robotparser:解析robots.txt的工具

爬虫步骤

一个基本的爬虫通常分为数据采集(网页下载)、数据处理(网页解析)和数据存储(将有用的信息持久化)三个部分内容。

一般来说爬虫工作流程包括以下几个步骤:

1、设定抓取目标(种子页面/起始页面)并获取网页。

2、当服务器无法访问时,按照指定的重试次数尝试重新下载页面。

3、在需要的时候设置用户代理或隐藏真实IP,否则可能无法访问页面。

4、对获取的页面进行必要的解码操作然后抓取出需要的信息。

5、在获取的页面中通过某种方式(如正则表达式)抽取出页面中的链接信息。

6、对链接进行进一步的处理(获取页面并重复上面的动作)。

7、将有用的信息进行持久化以备后续处理。

爬取小说——《坏蛋是怎样炼成的》

# !/usr/bin/env python
# -*- coding:utf8 -*-
import requests
import re

url = 'https://www.biquguan.com/bqg337675/'
'''模拟浏览器发送http请求'''
response = requests.get(url)
'''编码方式设置为tuf-8'''
response.encoding = "utf-8"
'''将目标小说主页的网页源码转换为文本'''
html = response.text
'''找到小说的书名'''
title = re.findall(r'<meta property="og:title" content="(.*?)" />',html)[0]
'''新建一个文件,保存小说内容'''
fb = open('%s.txt' % title, 'w',encoding='utf-8')
'''获取每一章的信息(章节,url)'''
dl = re.findall(r'<div id="list">.*?</dl>',html,re.S)[0]    #加上re.S后,匹配包括所有的包括空格回车的字符
chapter_info_list = re.findall(r'href="(.*?)">(.*?)<',dl,re.S)
'''循环每一个章节,分别去下载'''
for chapter_info in chapter_info_list:
    chapter_url,chapter_title = chapter_info
    chapter_url = "https://www.biquguan.com/bqg337675/" + chapter_url#此处尽量不要用加号,为了节省内存
'''下载章节内容'''
    chapter_response = requests.get(chapter_url)
    chapter_response.encoding = 'utf-8'
    chapter_html = chapter_response.text

    '''提取下载章节内容中的小说主体'''
    chapter_content = re.findall(r'<div id="content">(.*?)<script>chaptererror\(\);</script>',chapter_html,re.S)[0]

    '''清洗与小说内容无关的数据'''
    chapter_content = chapter_content.replace(r'\s','')
    chapter_content = chapter_content.replace('&nbsp;','')
    chapter_content = chapter_content.replace('<br />', '')
    chapter_content = chapter_content.replace('<br/>','')
    '''将数据持久化——保存小说'''
    fb.write(chapter_title)
    fb.write(chapter_content)
    fb.write('\n')

爬虫注意事项

1、处理相对链接,有时候我们从页面中获取的链接不是一个完整的绝对链接而是一个相对链接,这种情况下需要将其与URL前缀进行拼接(urllib.parse中的urljoin()函数可以完成此项操作)。

2、设置代理服务,有些网站会限制访问的区域(例如美国的Netfllix屏蔽了很多国家的访问),有些爬虫需要隐藏自己的身份,在这种情况下可以设置使用代理服务器,代理服务器有免费(如西刺代理、快代理)和付费两种(如讯代理、阿布云代理),付费的一般稳定性和可用性都更好,可以通过rullib.request中的ProxyHandler来为请求设置代理。

3、限制下载速度,如果我们的爬虫获取网页的速度过快,可能就会面临被封禁或者产生“损坏动产”的风险(可能会导致吃官司并且败诉),可以在俩次下载之间添加延时从而对爬虫进行限速。

4、避免爬虫陷阱,有些网站会动态生成页面内容,这会导致产生无限多的页面(例如在线万年历通常会有无穷无尽的链接)。可以通过记录达到当前页面经过了多少个链接(链接深度)来解决该问题,当达到事先设定的最大深度时爬虫就不再像队列中添加该网页中的链接了。

5、SSL相关问题,在使用urlopen打开一个HTTPS链接时会验证一次SSL证书,如果不做处理会产生错误提示:“SSL:CETRIFICATE_VERIFY_FAILED”,可以通过以下两种方式解决:

1、使用未经验证的上下文
import ssl

request = rullib.request.Request(url='...',headers={...})
context = ssl._create_unverified_context()
web_page = urllib.request.urlopen(request,context=context)
2、设置全局的取消证数验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章