• 整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案


           最近看崔庆才老师的爬虫课程,第一个实战课程是requests和正则表达式爬取猫眼电影Top100榜单。虽然理解崔老师每一步代码的实现过程,但自己敲代码的时候还是遇到了不少问题:

        问题1:获取response.text时出现中文乱码的问题

        问题2:通过requests.get()方法获取的网页代码与网页源代码不一致的问题 

          问题3:正则表达式匹配内容为空(多次修改pattern,甚至直接copy崔老师视频中的pattern也输出为空)

    问题1:获取response.text时出现中文乱码的问题

     1 import requests
     2 from requests.exceptions import RequestException
     3 import re
     4 
     5 def get_one_page(url):
     6     try:
     7         response = requests.get(url)
     8         if response.status_code == 200:
     9             return response.text
    10         else:
    11             return None
    12     except RequestException:
    13         return None
    14 
    15 shili = get_one_page('http://maoyan.com/board/4?')
    16 print(shili)

          上述代码运行后出现中文乱码的问题,经过网上收集资料显示:requests是从服务器返回的Response Headers 中Content-Type中获取编码,若指定了Charset就根据指定识别编码,否则就使用默认的ISO-8859-1,当服务器不符合此规范时就会出现乱码。解决方案是根据requests中的utils模块的get_encodings_from_content()方法进行解码:

    # 将上述代码中第9行进行修改
    
    content = response.text.encode('ISO-8859-1').decode(requests.utils.get_encodings_from_content(response.text)[0])
    return content

    这样就顺利解决了中文乱码的问题,但是后面发现有更简单的方法(通过添加headers参数):

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecho) Chrome/85.0.4183.121 Safari/537.36'
    }
    response = requests.get(url, headers=headers)

     

    问题2:通过requests.get()方法获取的网页代码与网页源代码不一致的问题

    从network - Requests Headers下直接复制user-agent来添加请求头,发现得到的网页代码html属性是“android”:

    正确的源代码应该是这样的:

    经过与崔老师的代码比较并进行调试,发现是浏览器复制的请求头出现了问题:

    浏览器直接复制的user-agent 是这样的:

     

    于是我上网搜索请求头user-agent的构成,以Chrome为例:

           将其分为四个部分:

                   (1)默认部分:Mozilla/5.0

          (2)表示操作系统版本部分:(Windows NT 10.0; Win64; x64)

            (3)表示搜索引擎部分:AppleWebKit/537.36 (KHTML, like Gecho)

            (4)表示浏览器版本部分:Chrome/85.0.4183.121 Safari/537.36

    发现通过浏览器直接复制的user-agent中操作系统版本不对,这是因为在F12代码页面下点击了左上角的手机模式,将其关闭即可。

     

    问题3:正则表达式匹配内容为空(多次修改pattern,甚至直接copy视频中的pattern也输出为空)

    敲代码时自己尝试写正则表达式,运行后没有报错但是返回空列表:

    def parser_one_page(html):
        pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>'
                            + '(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">'
                            + '(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
        items = re.findall(pattern, html)
        print(items)
    
    def main():
        url = 'https://maoyan.com/board/4?'
        html = get_one_page(url)
        parser_one_page(html)
    
    if __name__ == '__main__':
        main()

    后面发现直接复制URL时是https协议,改为http后能够正确返回pattern匹配内容。

     

    非计算机专业爬虫小白,理论知识不足,欢迎计算机大神批评指正。

     

  • 相关阅读:
    JS时间自动更新
    浏览器一般兼容问题
    实现笛卡尔心形线的重复循环绘制
    js判断是否为ie6以外的浏览器,若是,则调用相应脚本
    html+css+js实现标签页切换
    实现跨浏览器的背景渐变
    IE8支持HTML5的占位符placeholder
    JS打造的跟随鼠标移动的酷炫拓扑图案
    JS获取阴历阳历和星期
    svn up时提示跳过某节点
  • 原文地址:https://www.cnblogs.com/chang2021/p/13754912.html
Copyright © 2020-2023  润新知