python3 学习(2):在网站地图爬虫时的cannot use a string pattern on a bytes-like object 问题的解决方法

python3.6.5 +  pycharm

注意:

一、python3里的 urllib2 已经没有了,改为了 urllbi.request,因此,直接导入 import urllib.request 即可。

二、必须对正则表达式里的引用变量进行格式变换  .decode(‘utf-8‘),否则会报错说 不能在一个字节类的对象上使用字符串格式。

如下代码所示。

### 一、 网站地图爬虫,控制用户代理的设定,可捕获异常、重试下载并设置用户代理。wswp: web scraping with python
import urllib.request  ## -- written by LiSongbo
def Rocky_dnload(url,user_agent=‘wswp‘,num_retries = 2):
    print(‘Downloading:‘,url)
    LiSongbo_he={‘User-agent‘:user_agent}
    request = urllib.request.Request(url, headers=LiSongbo_he)
    try:  ## -- written by LiSongbo
html = urllib.request.urlopen(request).read()
    except urllib.request.URLError as e:  ## -- written by LiSongbo
print(‘Download error:‘,e.reason)
        html = None
        if num_retries > 0:  ## -- written by LiSongbo
if hasattr(e,‘code‘) and 500 <= e.code < 600:
                return Rocky_dnload(url,user_agent,num_retries-1) ## retry 5xx HTTP errors
return html

import re  ## -- written by LiSongbo
def Rocky_crawl_sitemap(url):  ## -- written by LiSongbo
sitemap = Rocky_dnload(url)  ## download the sitmap file
    # sitemap = sitemap.decode(‘utf-8‘) ## must add this .
links = re.findall(‘<loc>(.*?)</loc>‘, sitemap)  ## extract the sitemap links from flag loc
for link in links:  ## download each link
html = Rocky_dnload(link)  ## crape html here
Rocky_crawl_sitemap(‘http://example.webscraping.com/sitemap.xml‘)
运行结果报错:

Downloading: http://example.webscraping.com/sitemap.xml
Traceback (most recent call last):
  File "C:/Users/klooa/my_env/book9/test.py", line 25, in <module>
    Rocky_crawl_sitemap(‘http://example.webscraping.com/sitemap.xml‘)
  File "C:/Users/klooa/my_env/book9/test.py", line 22, in Rocky_crawl_sitemap
    links = re.findall(‘<loc>(.*?)</loc>‘, sitemap)  ## extract the sitemap links from flag loc
  File "C:\Users\klooa\AppData\Local\Programs\Python\Python36\lib\re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
TypeError: cannot use a string pattern on a bytes-like object

必须在 sitemap的下一行加上

sitemap = sitemap.decode(‘utf-8‘)

修改后的运行结果为:

Downloading: http://example.webscraping.com/sitemap.xml
Downloading: http://example.webscraping.com/places/default/view/Afghanistan-1
Downloading: http://example.webscraping.com/places/default/view/Aland-Islands-2
Downloading: http://example.webscraping.com/places/default/view/Albania-3
Downloading: http://example.webscraping.com/places/default/view/Algeria-4
Downloading: http://example.webscraping.com/places/default/view/American-Samoa-5
Downloading: http://example.webscraping.com/places/default/view/Andorra-6
Downloading: http://example.webscraping.com/places/default/view/Angola-7
Downloading: http://example.webscraping.com/places/default/view/Anguilla-8
Downloading: http://example.webscraping.com/places/default/view/Antarctica-9
Downloading: http://example.webscraping.com/places/default/view/Antigua-and-Barbuda-10
Downloading: http://example.webscraping.com/places/default/view/Argentina-11
Downloading: http://example.webscraping.com/places/default/view/Armenia-12
Download error: TOO MANY REQUESTS
Downloading: http://example.webscraping.com/places/default/view/Aruba-13

Download error: TOO MANY REQUESTS

……

## -- written by LiSongbo

原文地址:https://www.cnblogs.com/LiSongbo/p/9245449.html

时间: 2024-10-06 14:38:37

python3 学习(2):在网站地图爬虫时的cannot use a string pattern on a bytes-like object 问题的解决方法的相关文章

vue-cli3 打包时使用‘babel-loader’遇到Cannot assign to read only property ‘exports’ of object &#39;#&#39;问题的解决方法。

原文链接:http://www.pianshen.com/article/9677274805/ 第一种原因就是import和module.exports的混用要知道commonJS和ES6的语法是不太一样的前者是require和module.exports后者则是import和exports,当你混用这两个语法的时候,webpack就会报错,也就是第一种情况.为了使编译好的程序能在大多数浏览器下运行.webpack里面有一个编译器叫Babel,负责把ES6的语言转化为commonJS以兼容绝大

关于vue-cli3打包时遇到Cannot assign to read only property &#39;exports&#39; of object &#39;#&lt;Object&gt;&#39;问题的解决方法。

vue-cli3打包时遇到Cannot assign to read only property 'exports' of object '#<Object>'问题的解决方法. 大致是说,在webpack打包的时候,可以在js文件中混用require和export.但是不能混用import 以及module.exports. 因为webpack 2中不允许混用import和module.exports,   为了使编译好的程序能在大多数浏览器下运行.webpack里面有一个编译器叫Babel,

Python和Ruby抓取网页时的中文乱码问题(在Eclipse和Apatana Studio下均是这种解决方法

Python抓取中文网页乱码 环境1:Eclipse+pydev2.2+python2.7? 环境2:Apatana Studio3+ pydev2.2+python2.7? ????run时设置 run-->run configurations->python run->选中当前运行文件->Common->?Encoding?->Others->输入"GBK" 中文是:运行-->运行配置->python run->选中当前运

Eclipse启动时弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法

在“安卓巴士”上看得帖子,一个哥们儿留了百度云的adt资源,然后下了一个64位的adt,我的操作系统是win8.1.今天打开adt出现了   看网上解释说Eclipse的位数和jdk应该是一样的,然后我马上就试一试. 我的D:\Program Files (x86)\都是是存的32位的程序,我就在cmd下测试了一下: 而D:\Program Files\存的是64位的程序,我把我的电脑的环境变量jdk的路径改了64位的jdk8,如 在cmd 下测试为 最终我成功打开了adt_x64: 注:JNI

在安装project2010 64位时提示 “无法安装64位office,因为已有32位版本”解决方法

1.点击电脑左下角开始按钮----选择运行(或者window+R快捷键)---输入命名"regedit" 2.弹出注册表编辑器窗口,选择HKEY_CLASSES_ROOT,打开子选项 3.然后找到Installer文件夹,展开文件列表(文件太大的话直接在键盘上输入installer这个单词就好) 4.接着找到"Products"打开其子文件夹 5.双击打开,一般情况就是第一个文件夹,点击右键导出随你输入文件名备份一个,然后在注册表中选择这个文件点击右键删除 6.然后

转 Android学习笔记: 学习过程中碰到的一些问题及解决方法

在学习Android开发的过程中遇到了不少的问题,所幸的是最终经过上网查询都得到了解决.现在将我在学习Android开发过程中遇到的一些问题及解决的方法整理如下. 1.R.java不能实时更新 问题描述:在res文件中新增的变量不能在R.java中实时的显示出来. 解决方法:选择菜单栏的“Project”,勾选“Build Automatically”选项. 2.LogCat视窗没有显示 问题描述:在Eclipse的右下方没有显示LogCat视窗. 解决方法:选择菜单栏的“Windows”,再选

域名解析后网站却不能访问的原因及解决方法?

众所周知,域名解析的过程非常复杂,是一个全球域名系统逐级更新的方式,加上用户上网调用的DNS服务器也有缓存,只有缓存过期重新读取根数据库的解析记录,解析的IP地址才能被浏览者看到.但是有些用户会遇到域名解析之后,网站却不能访问.今天宵云小编就针对这个问题以及有哪些解决方法来个大家总结一下. 一般情况下,域名解析后却不能访问的原因: 1.域名解析提交后,一般不会立即生效,需要等待一段时间才能访问. 2.域名解析时,相关参数设置错误. 3.如果租用的国内服务器,网站备案未成功被系统取消域名绑定. 4

升级到win10之后word和excel提示“向程序发送命令时出现问题”解决方法

本人的电脑直接从win7升级到win10之后,原来win7安装的是office2007,打开word和excel文档会提示“向程序发送命令时出现问题”,导致无法使用. 在网上找到解决方案如下: word解决方法:http://www.xitongcheng.com/jiaocheng/win10_article_10653.html 1.找到office 安装目录 C:\Program Files\Microsoft Office\Office12找到 WINWORD.exe这个exe文件. 2

浏览器主页被www.2345.com网站劫持的解决方法【图解】

研究背景 最近本人发现电脑所有浏览器的主页都被2345.com网站劫持了,本人自认为电脑水平还不算是菜鸟,但找遍了注册表.启动项.快捷方式.服务管理和计划任务中均无法发现流氓软件的踪迹,其手段真是高到天上去了,百度了网上所有的帖子,也没人能说出个具体的解决办法,按照高手说的用Process Hacker进程软件查看系统发现,浏览器果然被流氓用程序的启动命令劫持到了2345.com网站(如下图),2345.com网站太缺德了,真的忍不住想再次诅咒它,让2345.com网站的管理层统统去吃翔,编写劫