鱼C论坛

 找回密码
 立即注册
查看: 1044|回复: 4

[已解决]爬虫55课,获取网页链接出错的问题

[复制链接]
发表于 2018-7-21 21:00:58 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 小小小小的鱼丶 于 2018-7-21 21:42 编辑

题目要求

题目要求

  1. 源码如下:
  2. import urllib.request
  3. import urllib.parse
  4. import re
  5. from bs4 import BeautifulSoup

  6. def main():
  7.     keyword = input("请输入关键词:")
  8.     keyword = urllib.parse.urlencode({"word":keyword})
  9.     response = urllib.request.urlopen("http://baike.baidu.com/search/word?%s" % keyword)
  10.     html = response.read()
  11.     soup = BeautifulSoup(html, "html.parser")

  12.     for each in soup.find_all(href=re.compile("view")):
  13.         content = ''.join([each.text])
  14.         url2 = ''.join(["http://baike.baidu.com", each["href"]])
  15.         response2 = urllib.request.urlopen(url2)
  16.         html2 = response2.read()
  17.         soup2 = BeautifulSoup(html2, "html.parser")
  18.         if soup2.h2:
  19.             content = ''.join([content, soup2.h2.text])
  20.         content = ''.join([content, " -> ", url2])
  21.         print(content)

  22. if __name__ == "__main__":
  23.     main()
复制代码

  1. 这一段有问题,请问应该怎么改
  2. url2 = ''.join(["http://baike.baidu.com", each["href"]])
  3.         response2 = urllib.request.urlopen(url2)
  4.         html2 = response2.read()
  5. UnicodeEncodeError: 'ascii' codec can't encode characters in position 36-39: ordinal not in range(128)
复制代码


最佳答案
2018-7-22 13:01:31
我写的代码如下:
  1. import urllib.request
  2. import re
  3. import time
  4. import urllib.parse

  5. headers = {
  6.     'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  7. }

  8. def getKeyUrl(key_word):
  9.     init_url = 'https://baike.baidu.com/search?word=' + key_word
  10.     req = urllib.request.Request(init_url, headers=headers)
  11.     key_text = urllib.request.urlopen(req)
  12.     key_html = re.findall(r'<a class="result-title" href="(.*?)"', key_text.read().decode('utf-8'), re.S)
  13.     return key_html[0]

  14. def getAllKeyUrl(key_url):
  15.     req = urllib.request.Request(key_url, headers=headers)
  16.     key_text = urllib.request.urlopen(req)
  17.     key_url_list = re.findall(r'href="/item/(.*?)"', key_text.read().decode('utf-8'), re.S)
  18.     return key_url_list

  19. def getMainTitle(key_url_list):
  20.     for title in key_url_list:
  21.         url = 'https://baike.baidu.com/item/' + title
  22.         req = urllib.request.Request(url, headers=headers)
  23.         key_text = urllib.request.urlopen(req)
  24.         main_title_list = re.findall(r'<h1\s>(.*?)</h1>', key_text.read().decode('utf-8'), re.S)
  25.         copy_title_list = getCopyTitle(url)
  26.         if copy_title_list:
  27.             print(main_title_list[0] + copy_title_list[0] + ' -> ' + url)
  28.         else:
  29.             print(main_title_list[0] + ' -> ' + url)
  30.         time.sleep(1)

  31. def getCopyTitle(url):
  32.     req = urllib.request.Request(url, headers=headers)
  33.     key_text = urllib.request.urlopen(req)
  34.     copy_title_list = re.findall(r'<h2>(.*?)</h2>', key_text.read().decode('utf-8'), re.S)
  35.     return copy_title_list

  36. if __name__ == '__main__':
  37.     key_word = input('请输入你要查询的百度百科关键词:')
  38.     # 楼主可以把urllib.parse.quote(key_word)换成key_word,也就是不加quote方法,你就知道了
  39.     key_url = getKeyUrl(urllib.parse.quote(key_word))
  40.     key_url_list = getAllKeyUrl(key_url)
  41.     getMainTitle(key_url_list)
复制代码
运行后结果为: 0.png

注意上述我给你注释的部分~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-21 21:41:47 | 显示全部楼层
额,已经发现问题了。因为爬取百度百科得到的第一个each["href"]]和第二个each["href"]]为:/wikicategory/view?categoryName=多肉植物和/wikicategory/view?categoryName=恐龙大全,后面有中文,去urlopen的时候会出错,可以直接try掉。。可能是百度的反爬机制吧。。暂时没有想到更好的解决办法,有大神看到可以解决下。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-22 08:27:30 | 显示全部楼层
我的也是,等一下解决方案。试了在几个地方更改编码方案,还是不管用。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-22 13:01:31 | 显示全部楼层    本楼为最佳答案   
我写的代码如下:
  1. import urllib.request
  2. import re
  3. import time
  4. import urllib.parse

  5. headers = {
  6.     'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  7. }

  8. def getKeyUrl(key_word):
  9.     init_url = 'https://baike.baidu.com/search?word=' + key_word
  10.     req = urllib.request.Request(init_url, headers=headers)
  11.     key_text = urllib.request.urlopen(req)
  12.     key_html = re.findall(r'<a class="result-title" href="(.*?)"', key_text.read().decode('utf-8'), re.S)
  13.     return key_html[0]

  14. def getAllKeyUrl(key_url):
  15.     req = urllib.request.Request(key_url, headers=headers)
  16.     key_text = urllib.request.urlopen(req)
  17.     key_url_list = re.findall(r'href="/item/(.*?)"', key_text.read().decode('utf-8'), re.S)
  18.     return key_url_list

  19. def getMainTitle(key_url_list):
  20.     for title in key_url_list:
  21.         url = 'https://baike.baidu.com/item/' + title
  22.         req = urllib.request.Request(url, headers=headers)
  23.         key_text = urllib.request.urlopen(req)
  24.         main_title_list = re.findall(r'<h1\s>(.*?)</h1>', key_text.read().decode('utf-8'), re.S)
  25.         copy_title_list = getCopyTitle(url)
  26.         if copy_title_list:
  27.             print(main_title_list[0] + copy_title_list[0] + ' -> ' + url)
  28.         else:
  29.             print(main_title_list[0] + ' -> ' + url)
  30.         time.sleep(1)

  31. def getCopyTitle(url):
  32.     req = urllib.request.Request(url, headers=headers)
  33.     key_text = urllib.request.urlopen(req)
  34.     copy_title_list = re.findall(r'<h2>(.*?)</h2>', key_text.read().decode('utf-8'), re.S)
  35.     return copy_title_list

  36. if __name__ == '__main__':
  37.     key_word = input('请输入你要查询的百度百科关键词:')
  38.     # 楼主可以把urllib.parse.quote(key_word)换成key_word,也就是不加quote方法,你就知道了
  39.     key_url = getKeyUrl(urllib.parse.quote(key_word))
  40.     key_url_list = getAllKeyUrl(key_url)
  41.     getMainTitle(key_url_list)
复制代码
运行后结果为: 0.png

注意上述我给你注释的部分~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-22 15:11:25 | 显示全部楼层
零度非安全 发表于 2018-7-22 13:01
我写的代码如下:
运行后结果为:

谢谢谢谢,先mark一下,随后看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 22:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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