鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 7

[已解决]求助,跟着网上视频敲的一个爬虫小程序,为什么无法正常使用?求鱼油帮忙看看

[复制链接]
发表于 2019-6-29 00:19:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原代码:
import  urllib.request
import urllib.parse
import string
def get_method_params():
    url = "https://www.baidu.com/s?tn=88093251_17_hao_pg&ie=utf-8&sc=UWY3rj04n1cdnNtkPdqCmyqxTAThIjYkPHmkPWbvnjn3PHb3FhnqpA7EnHc1Fh7W5HndPWfsnjbsPj0&ssl_sample=s_88&srcqid=3243340699557307542&H123Tmp=nunew7&word="
    #拼接字符串(汉字)
    #python可以接受的数据
    #
    name ="美女"
    final_url = url + name
    print(final_url)
    #代码发送了请求
    #网址里面包含了汉字,ascii是没有汉字的,需要url转译
    #将包含汉字的网址进行转译
    encode_new_url = urllib.parse.quote(final_url,safe = string.printable)
    print(encode_new_url)
    #使用代码发送网络请求
    response = urllib.request.urlopen(encode_new_url)
    print(response)
    data = response.read().decode()
    print(data)
    #保存到本地
    with open("02-encode.html","w",encoding = "utf-8") as f:
        f.write(data)
    #UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-185: ordinal not in range(128)
    #原因:python是解释性语言,解析器只支持  ascii只支持 0-127,即不支持中文
get_method_params()

已经确认是代码是和视频中一模一样的,但是我的却无法正常运行,生成的HTML文件点击打开的时候会不断的刷新,我的运行结果如图
最佳答案
2019-6-29 09:50:15
这是百度的反爬机制,加个请求头就好了

  1. import  urllib.request
  2. import urllib.parse
  3. import string
  4. def get_method_params():
  5.     url = "https://www.baidu.com/s?ie=UTF-8&wd="
  6.     headers = {
  7.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36',
  8.     }
  9.     #拼接字符串(汉字)
  10.     #python可以接受的数据
  11.     #
  12.     name ="美女"
  13.     final_url = url + name
  14.     print(final_url)
  15.     #代码发送了请求
  16.     #网址里面包含了汉字,ascii是没有汉字的,需要url转译
  17.     #将包含汉字的网址进行转译
  18.     encode_new_url = urllib.parse.quote(final_url,safe = string.printable)
  19.     print(encode_new_url)
  20.     #使用代码发送网络请求
  21.     req = urllib.request.Request(encode_new_url, headers=headers) # 加个头就好了
  22.     response = urllib.request.urlopen(req)
  23.     print(response)
  24.     data = response.read().decode()
  25.     print(data)
  26.     #保存到本地
  27.     with open("02-encode.html","w",encoding = "utf-8") as f:
  28.         f.write(data)
  29.     #UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-185: ordinal not in range(128)
  30.     #原因:python是解释性语言,解析器只支持  ascii只支持 0-127,即不支持中文
  31. get_method_params()
复制代码

左边会一直刷新,正常来说,会进如百度搜索出的一个美女页面

左边会一直刷新,正常来说,会进如百度搜索出的一个美女页面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-29 06:45:57 From FishC Mobile | 显示全部楼层
别老是跟着人敲代码
看看自己想实现啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-29 09:50:15 | 显示全部楼层    本楼为最佳答案   
这是百度的反爬机制,加个请求头就好了

  1. import  urllib.request
  2. import urllib.parse
  3. import string
  4. def get_method_params():
  5.     url = "https://www.baidu.com/s?ie=UTF-8&wd="
  6.     headers = {
  7.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36',
  8.     }
  9.     #拼接字符串(汉字)
  10.     #python可以接受的数据
  11.     #
  12.     name ="美女"
  13.     final_url = url + name
  14.     print(final_url)
  15.     #代码发送了请求
  16.     #网址里面包含了汉字,ascii是没有汉字的,需要url转译
  17.     #将包含汉字的网址进行转译
  18.     encode_new_url = urllib.parse.quote(final_url,safe = string.printable)
  19.     print(encode_new_url)
  20.     #使用代码发送网络请求
  21.     req = urllib.request.Request(encode_new_url, headers=headers) # 加个头就好了
  22.     response = urllib.request.urlopen(req)
  23.     print(response)
  24.     data = response.read().decode()
  25.     print(data)
  26.     #保存到本地
  27.     with open("02-encode.html","w",encoding = "utf-8") as f:
  28.         f.write(data)
  29.     #UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-185: ordinal not in range(128)
  30.     #原因:python是解释性语言,解析器只支持  ascii只支持 0-127,即不支持中文
  31. get_method_params()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-29 13:44:06 | 显示全部楼层
newu 发表于 2019-6-29 09:50
这是百度的反爬机制,加个请求头就好了

非常感谢你的耐心回答,新司机上路,看的视频比较久远,受于眼界和经验不足,想到了可能是反爬虫机制,也完全不知道如何解决,你的回答真的让我又积累了一些经验,但是我还想请教你最后一个问题,同样没加header的情况下爬百度的一个小程序,生成的html文件却又可以正常打开,请问这个又是为什么呢?为什么这样子的时候User-Agent却没有生效,我的网页可以正常打开,有空的话麻烦你帮忙看一看,代码和打开结果如下展示:
import urllib.request

def load_data():
    url = "http://www.baidu.com/"
    #get的请求
    #http的请求
    #response:http响应的对象
    response = urllib.request.urlopen(url)
    print(response)
    #读取内容是byte类型,需要用decode()函数解码
    data = response.read()
    print(data)
    str_data = data.decode("utf-8")
    print(str_data)
    #将数据写入文件
    with open("baidu1.html","w",encoding = "utf-8")as f:
        f.write(str_data)
    #将字符串类型转换成bytes
    str_name = "baidu"
    bytes_name = str_name.encode("utf-8")
    print(bytes_name)

    #python爬取的类型:str bytes
    #如果爬取回来的是bytes类型:但是你需要写入的时候需要字符串 decode("utf-8")
    #如果爬取回来的str类型:但你需要写入的类型是bytes类型 encode("utf-8")
load_data()C:\Users\Administrator\Desktop\baidu1html.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-29 13:47:02 | 显示全部楼层
newu 发表于 2019-6-29 09:50
这是百度的反爬机制,加个请求头就好了

因为后面发的那个小程序才是我写的第一个程序,同样没加headr却可以正常打开,所以在写刚才你回答的那个问题的程序的时候,虽然有考虑过是不是反爬虫,但是第一个能打开,我就打消了这个疑虑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-29 13:49:26 | 显示全部楼层
MadJoker 发表于 2019-6-29 13:47
因为后面发的那个小程序才是我写的第一个程序,同样没加headr却可以正常打开,所以在写刚才你回答的那个问 ...

那个图片没加载出来,不过不要紧,理解你的意思。

就是啊,不用头的话首页是可以直接访问的,但是加了搜索字符串再请求的话就有限制了哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-29 13:59:51 | 显示全部楼层
newu 发表于 2019-6-29 13:49
那个图片没加载出来,不过不要紧,理解你的意思。

就是啊,不用头的话首页是可以直接访问的,但是加了 ...

我明白了,非常感谢你的回答!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-29 14:03:50 | 显示全部楼层
MadJoker 发表于 2019-6-29 13:59
我明白了,非常感谢你的回答!!!

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 18:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表