【爬虫】爬取百度首页的title数据

爬虫添加了异常处理、编码检测、服务器错误重新连接、动态UA和使用代理IP的功能,已经具备了很强的鲁班性
这些功能满足大多数要求,一般情况下,不会用到所有的功能,具体还要看自己的需求和网站特性

并不是每次写代码都需要写这么多代码,异常处理、编码检测、服务器错误重新连接、动态UA和使用代理IP的功能你可以复制粘贴就行了,最重要的是对网页内容进行解析,提取和存储等操作

import re
import time
import chardet
import requests
import urllib.robotparser
from fake_useragent import UserAgent


# 获取headers
def get_headers():
    ua = UserAgent()
    user_agent = ua.random
    headers = {'User-Agent': user_agent}
    return headers


# 这里获取代理ip的函数直接给出了proxies,
# 我们也可以用此函数去爬免费的代理ip,因为不是重点,这里不再赘述
def get_proxies():
    proxies = {
        "http": "171.35.147.205:9999",
        "http": "110.243.8.14:9999",
        "http": "120.83.111.118:9999"
    }

    return proxies


# robots.txt 检测
def robot_check(robotstxt_url, headers, url):
    rp = urllib.robotparser.RobotFileParser()
    rp = set_url(robotstxt_url)
    rp.read()
    result = rp.can_fetch(headers['User-Agent'], url)
    return result


# 获取网页数据,这里没有返回data.text,
# 因为抓取图片图片时返回的应该是data.content
def get_data(url, num_retries=3, proxies=None):
    try:
        data = requests.get(url, timeout=5, headers=None)
        print(data.status_code)
    except requests.exceptions.ConnectionError as e:
        print("请求错误, url:", url)
        print("错误详细:", e)
        data = None
    except:  # other error
        print("未知错误,url:", url)
        data = None

    if (data != None) and (500 <= data.status_code < 600):
        if (num_retries > 0):
            print("服务器错误,正在重试。。。")
            time.sleep(1)
            num_retries -= 1
            get_data(url, num_retries, proxies=proxies)
    return data


# 对网页内容进行解析,提取和存储等操作
def parse_data(data):
    if data == None:
        return None

    charset = chardet.detect(data.content)
    data.encoding = charset['encoding']
    html_text = data.text
    '''
    对网页数据进行解析提取等操作,假设这里要获取网页的title
    '''
    interesting_data = re.findall('<title>(.*?)</title>', html_text)

    return interesting_data

if __name__ == '__main__':
    headers = get_headers()
    proxies = get_proxies()
    data = get_data("http://www.baidu.com", num_retries=3, proxies=proxies)
    interesting_data = parse_data(data)
    print(interesting_data)

200 ['百度一下,你就知道']

posted @ 2020-10-24 12:14  不懂就问薛定谔的猫  阅读(741)  评论(0)    收藏  举报