请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

爬取网页中文信息遭遇乱码

# -*- coding: utf-8 -*-
import requests,re,pprint
from selenium import webdriver
from modle import *

start_url = "http://www.zmz2019.com/resourcelist/?page=1&channel=tv&area=美国"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
domain = "http://www.zmz2019.com"
tail_url = "http://www.zmz2019.com/resource/26654"
complete_info = 'http://www.zmz2019.com/resource/index_json/rid/{}/channel/tv'.format('Id')

browser = webdriver.Chrome(executable_path='D:\Python37\chromedriver.exe')
browser.get(tail_url)
import time
time.sleep(5)
cookies = browser.get_cookies()
cookies_dict = {}
for item in cookies:
    cookies_dict[item["name"]] = item["value"]

def parse_tail(tail_url):
    tail_res = requests.get(tail_url,headers=headers,cookies=cookies_dict).text
    P_Tail_Title = '<dl class="fr" id="operate_link">.*?<h2>.*?(.*?)<label id="play_status">'
    Tail_Title = re.findall(P_Tail_Title,tail_res,re.S)
    pass

def parse_topic(url):
    movie = Renren_Spider()
    res = requests.get(url,headers=headers).text
    p_List = '<div class="resource-showlist has-point">.*?<ul>(.*?)</ul>'
    lists = re.findall(p_List,res,re.S)[0].strip()
    p_Lis = '<li class="clearfix">(.*?)</li>'
    Lis = re.findall(p_Lis,lists,re.S)
    for li in Lis:
        P_Title = '<div class="fl-info">.*?</strong>(.*?)</a>'
        Title = re.findall(P_Title,li,re.S)[0]
        P_Href = '<div class="fl-info">.*?<a href="(.*?)"'
        Href = re.findall(P_Href,li,re.S)[0]
        p_Id = "/.*?/(\d+)"
        Id = int(re.findall(p_Id,Href)[0])
        Href = domain + Href
        p_type = '<p>【类型】(.*?)</p>'
        type = re.findall(p_type,li,re.S)[0]

        movie.Id = Id
        movie.Title = Title
        movie.Href = Href
        movie.Type = type
        exist_id =  Renren_Spider.select().where(Renren_Spider.Id == movie.Id)
        if  exist_id:
            movie.save()
        else:
            movie.save(force_insert=True)

    P_pages = '<div class="pages">(.*?)</div>'
    pages = re.findall(P_pages,res,re.S)[0]
    P_next_page = "</b>&nbsp;<a href='(.*?)'>下一页"
    next_page = re.findall(P_next_page,pages)[0]
    p_check = r"/resourcelist/\?page=(.*?)&"
    check = int(re.findall(p_check,next_page)[0])
    if check <= 5:
    #if next_page :
        next_page = domain + next_page
        parse_topic(next_page)

if __name__ == "__main__":
    #parse_topic(start_url)
    parse_tail(tail_url)

Booby老师:
您好,学生最近为了练习正则表达式写了上面这个爬虫,但在解析详情页(’ parse_tail()’)时node中的中文信息全是乱码,尝试添加header和cookies到request.get()中还是爬出乱码。请老师指点如何解决该问题?
谢谢!

正在回答 回答被采纳积分+3

1回答

提问者 weixin_慕勒4383646 2019-09-27 16:21:43

Boddy老师:

问题已经解决,该问题与cookies和headers无关,其实就是个网页实际编码和requests请求到的内容的编码不一致。

首先在查看网页源代码里Meta元素中的charset=utf-8,然后debug一下下面的代码看一下requests请求到的编码为‘ISO-8859-1',编码不一致。

page_coding = requests.get(xxx).encoding

我突然想到了老师在课程中教的.encode()和.decode()方法。于是我先用.encode()将爬取的内容碎成二进制在用decode()将二进制用utf-8重新组合起来,代码如下:

tail_res = requests.get(xxxxx).text
tail_res = tail_res.encode('ISO-8859-1').decode('utf-8')

通过近一段时间来的爬虫练习感觉到老师的教学确实讲得全面,讲得细,在遇到困难是通过重看视频或’突然想起课程内容‘总能有解决的办法;您的课程几乎覆盖了我这段时间来遇到的所有问题,有些小知识点如这次这种,上课时忽略了,但在具体实践是却起到关键作用。再次衷心感谢老师的教导!!!

1 回复 有任何疑惑可以回复我~
  • bobby #1
    给力,你的分析问题的思路很准确,能通过页面自己查询编码问题,这一点很关键,也是其他学习的同学应该借鉴的。
    回复 有任何疑惑可以回复我~ 2019-09-28 17:14:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信