《Python编程与实践》第十一讲 答疑

《Python编程与实践》第十一讲 答疑

课程视频:

1、有时候在浏览网页的时候会出现图片显示不出来只显示了URL,应该如何避免这种情况出现

你是说浏览器里只显示图片URL吗?这和所用浏览器的图片处理方式有关,大部分时候应该是碰到了图片无法访问的情况,才会显示alt文本或对应的url,如果指向的图片已经删除或无法访问,在浏览器一段也没什么办法,如果可以访问,就刷新页面再试试看。

2、我有点感觉Python降低了代码的能力了,好多东西都封装好了,怎么办。

首先要说得是,并非每个细节都亲力亲为才能提高编程能力。如果想练手,可以完全不借助已有的库,自己从头实现,体验一下全套设计到实现到完善的过程;如果是面向目标编程,或者要完成一个完整功能,中只要有好用又可靠的库,不妨拿来使用,把更多精力放在核心逻辑上,很快可能会发现有些库实现的功能外延不准确、不够灵活、或者存在性能问题,这时候再考虑换用其他库或自己编程实现。除了分解问题、设计解决方案以外,学会在细节上作功能性、开发效率、可靠性、实际性能几方面的权衡也是很重要的编程能力。

3、为什么价格要转float,直接当字符串输出不行吗?在豆瓣“编程”类图书第一页url最后为“/编程”,在非第一页最后为“/编程/search=20*(n-1)”,n为页数,此时复制这样的url进行爬取会报错是为什么?

转成float是方便后续按数字大小排序或统计,如果仅作显示用,不转换也没有问题。在实际页面上翻页,会看到第二页的链接为https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=20&type=T,用/编程/search=20*(n-1)自己拼出目标url思路没有问题,需要注意以下几点:一是记得在前面加上https://book.douban.com构造完整URL;二是需要注意 /编程 部分最好提前做编码处理 转换成 /%E7%BC%96%E7%A8%8B ,可以用urllib.parse里的quote_plus进行转换:

>>> from urllib.parse import quote_plus
>>> print(quote_plus(u'编程'))
%E7%BC%96%E7%A8%8B

三是url的模式要完全匹配,按https://book.douban.com/tag/%E7%BC%96%E7%A8%8B?start=20&type=T的模式替换start参数就行,四是访问时记得加header信息。如果还有问题,就要看错误描述,分析下具体什么问题了。

4、一些限制复制粘贴的网页,是怎么样的机制。做爬虫的时候和普通网友有没有区别。

大部分的限制复制粘贴,只是用Javascipt脚本控制了内容区域的鼠标和键盘响应,对爬虫来说没影响,可以直接从网页源码中提取对应内容。

5、爬虫可以应用于应用程序吗?比如QQ微信微博,爬虫可以应用于应用程序吗?比如QQ微信微博,或者是游戏,获取游戏的地图资源等

可以啊,但限于通过HTTP和HTTPS访问的资源,如果通过端口或自定义协议进行通信,数据再加以封装甚至加密打包,采集的难度就大得多了。可以用fiddlercharles之类的嗅探工具,分析一下目标应用和服务端的通信过程,找到获取目标资源的API,分析相关参数的含义,接着就可以用爬虫进行抓取了。

6、UTF-8怎么处理字节

UTF-8使用1~4字节为每个字符编码:一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F);带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF);其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码;其他极少使用的语言字符使用4字节编码。

参考:

7、分不太清什么情况下可以用xpath,什么时候不能用

xpath就是用来定位页面元素的路径,需要定位和筛选元素都可以使用;如果源代码无法解析成DOM,就没法用xpath进行定位了。

8、为什么我爬到的数据是乱的?检查了几遍代码应该是没有问题,东西应该也没用爬错,不知道问题出在哪

是怎么个乱法?只是中文部分乱,可以试试指定页面编码格式,比如:

r = requests.get('http://......')
r.encoding = 'utf-8'
print(r.text)

9、如果xpath获取数据为空怎么办

可以用xpath helper插件验证一下,看看xpath是不是有问题,也需要检查一下采集到的页面源码,看想要获取的部分是不是包含在源码里,是不是符合之前设计的xpath,逐级排查问题。

10、网站的反爬机制是可以被攻破的吗,黑客针对网站的攻击有爬虫的“功劳”吗

攻防两方中总是在不断博弈中不断进步中,没有永远攻不破的防,也没有永远防得住的攻,跟反盗版技术一样,往往是看哪一边能“挺”得更久一些。黑客的攻击,往往首先要做的就是对目标做全面的探测和试探,包括可访问的端口、服务、API等,再通过进一步试探发现开放接口部分可能存在的漏洞,最后再加以利用,这个试探的过程,本质上就是一种“爬虫行为”——广义的爬虫,目的不仅仅是采集数据,也可以通过模仿正常网络访问,达到刷流量、试探、测试等目的。

11、装库的时候,输入“python3.10 -m pip......”就报错,把“3.10”删了就可以装,是我版本出错了吗

请参考第九讲答疑的问题34:

12、最后那个网页链接该再怎么爬取?

和之前爬取第一页的方法一样,还是用 requests.get() ,可以用一样的header信息,再用相同的xpath提取数据即可。

13、显示图片能不能用搜索出来的其他方法

可以啊,课上提到的display(HTML())的方式用到的是IPython自带的库,使用更方便,也比较稳定。

14、xpath能否用于普通字符串?提取信息时切片对从哪切还是不清楚?如果爬的网站更新了,有什么办法更新吗?感觉很多用法记不住,老师有啥办法记忆吗?

xpath只能用于能用DOM解析的HTML/XML等带有标记的结构化文档,单纯字符串的话是没办法用的。切片的使用可以参考官方文档:

内容更新的话,其实就是重新采集,用抽取出的新内容替换旧内容。经常用到自然就记住了,不用记住没种用法的每个细节,记个大概,用的时候知道到查就好,跟背单词一样,前两次看着眼生,多碰到几次就熟悉了。

15、为什么把itemtext强制转换为list就可以显示文本呢?

因为itertext()返回的是可迭代对象, 可迭代对象请参考:

重点是“一次性遍历”,可以用for...in...进行遍历,但不能直接用 print()输出,而用list()强制转换为列表,相当于进行一次遍历并将内容放到一个列表里,列表的内容是可以用print()输出的。

16、爬虫解析网页时,如何快速找到数据存放的位置,并提取其中的数据?

需要人工提前分析网页结构,构建提取特定信息的xpath或正则表达式。

17、可以用python解释器编译出c++代码吗

理论上是可行的,相当于用Python编程完成从C/C++代码汇编语言的翻译,感兴趣可以参考这个Repo:

是用Python写的简单C代码编译器,C++是类似的。

18、git如何使用还是不太会 经常保存不上去?Python的数据结构的代码和c++类似吗,还是说c++的写数据结构的代码封装好了直接被Python调用就行了呢

GitHub提交不了可能是网络问题,可以自己本地搭一个git服务,可以试试这个:

具体要看是什么数据结构了,有些数据结构在Python里是现成的,有些需要在已有数据结构基础上再开发。

19、如果遇到一段话有很多操作、函数调用相互交错, 很难看出实际的操作顺序啊, 有没有什么技巧?

技巧就是尽量“抓大放小”,先忽略嵌套调用的细节,把外层的逻辑捋顺,需要的话再深入调用过程,如果难理解的部分原作者没有给出注释,这样的代码不看也罢。

20、爬虫被网站监测并拉黑的界限是什么

每个网站有自己不同的容忍“阈值”,具体取决于网站规模和运营策略。事实上,只要和正常人工浏览访问有所不同的细节,都有可能被网站运营方注意到并阻止其访问,可能的细节包括所用的头信息、访问频度、访问链接、访问顺序、并发情况等等。

21、怎么编程实现爬虫定时调用爬取代码到指定网站爬取?

最简单的方法是用time.sleep()每次爬取完成后等待固定时长再次进行抓取。如果想实现更细致的定时爬取,可以用crontab工具定期执行爬虫的Python脚本,或者用第三方库,比如scheduleschedule使用示例如下:

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)

while 1:
    schedule.run_pending()
    time.sleep(1)

22、使用selenium库如何最大化提高爬取速度

可以参考这篇文章:

23、在去除每行最左端空格和最右端的\n语句里如果将itertext换成finaltext会出现什么结果?

itertext()是用来迭代获取文本的,可以获取当前节点及子节点所有文本内容。finaltext是什么?

24、爬虫的时候爬取插入图片是怎么操作呀?今天上课没听太明白

重点是用xpath定位到<img>所在位置,通过/@src提取图片网址,就完成了。例如:

cover = ""
elem_cover = block.xpath(".//img/@src")
if elem_cover:
    cover = elem_cover[0] 

25、这个啥时候用block,啥时候用elem啊?还有就是怎么在终端上显示图片?课上用的好像不太适用于终端

block和elem只是自己起的两个变量名,对应的是图书信息框和框里的一条信息,先用xpath定位到图书信息框,再在框下面用xpath定位每条信息项。课上的方法仅适用于natebook,终端无法直接显示原始图片。

26、请问怎么在scrapy框架下用selenium

可以参考以下Repo:

27、应该怎么避免重复爬取URL呢。

最简单的方法是用集合(set)保存爬取过的URL,每次爬取新URL时先看集合里是否存在,存在就跳过,不存在爬后将URL加入集合;如果规模较大,可以用Redis之类的服务在专门做去重;如果要提高去重力度,可以在去重之前先对URL进行标准化,比如小写化、端口信息标准化(比如":80")、页面锚点信息简化(如:#title),通过标准化, 可以把一些形式上不一致但实际上对应相同页面的URL规整成形式上一致的URL。

28、出现问题的分析顺序是?需要多次尝试的是什么?

先认真看异常信息,包括异常标题和异常描述,看错误堆栈反映的出错位置,并推断可能的产生原因;如果无法直接作出推断,可以对出错场景进行考察,输出出错时环境里各个变量信息、确认程序状态是否符合预期,如果依然无法确定,试着简化代码,逐步定位出错的具体位置。

29、像elem_title[0]中[0]代表什么?python有没有通用方法截取字符串中不固定位的数字,像“纸质版130元”和“纸质版130元起”都可以只截取130?

[0]表示获取下标0对应的第一个元素,如果elem_title是容器(如列表),则elem_title[0]表示列表的第一个元素;如果elem_title是字符串,则elem_title[0]表示字符串的第一个字符。要实现你说的这种提取,如果单纯用字符串操作,可以用find()查找“版”和“元”这两个字符的位置,再取中间子串,例如:

>>> s = '纸质版130元'
>>> s[s.find('版')+1:s.find('元')]
130

用正则表达式处理会更直接一些:

>>> import re
>>> s = '纸质版130元'
>>> re.findall('[\d\.]+', s)[0]

30、某些网站有反爬虫机制导致程序很难爬取其数据,但又提供接口可以使得我们可以设计程序爬取,这里面的原理是什么?

之所以反爬,一般主要出于两种考虑,一是大规模访问造成网络负载影响网站正常运营,二是看重数据价值不希望数据被批量拿走。那为什么又要提供API接口呢?一方面,API服务一般会部署在单独的节点,不影响主站正常服务,另一方面,API可以方便地对提供的数据进行控制,具体讲,就是把一部分数据提供给一部分人,可能是有合作的人、交了钱的人、或所有人,而数据也可以是部分数据、数据部分字段或经过加工的数据。

31、老师,平时如何锻炼将思维转换为编程思维,例如在解决一个问题时,非编程方法很简单,但就是不会编程,无从下手,不知道该怎么拆分编程问题,

所谓编程思维,其实就是把非编程方法变成编程的标准化过程、通过编程实现,实现准确高效重复执行的过程。所以,锻炼编程思维,就是锻炼把一般的解决思路转换成标准化程序化描述的能力。对于平时碰到的不论多小的问题,想想怎么把流程标准化描述,就是锻编程思维的最好方法。

32、如何提高爬取效率?

可以参考这篇:

33、使用XPath后没有输出。输出结果是字节类型,json对象无法正常显示。

没有输出可能是xpath没写对,可以用xpath helper确认一下。后面的问题描述很难准确理解……

34、为什么会设置反爬措施呢,这是否说明有些情况中爬虫不合理呢

参考问题30

35、pyquery和jquery是什么呀,特别是jquery.js看着好像是乱码呀

jQuery是用于简化HTML与JavaScript之间操作的JavaScript库,可以方便地定位和操作页面元素。pyquery是模仿jQuery语法定位和查询页面元素的Python库。

发布于 2021-12-13 14:59