查看原文
其他

每一个搞爬虫的人,都应该知道的神器!

朱小五 快学Python 2022-05-28

大家好,我是小五🧐

每天起床第一句,人生苦短,快学Python!

作为一个爬虫小菜鸟,一般爬的网站都是比较简单。

也就是先F12接口抓包,再requests爬取。

往往还需要复制header、Cookie等。

太麻烦了,对于我们来说,有没有更简单的办法呢?

确实可以提高一定效率,比如:curl请求命令转Python请求代码!

curl转Python

curl是利用URL语法在命令行方式下工作的开源文件传输工具,支持文件的上传和下载,是综合传输工具。[1]

以猫眼电影榜单为例,先在Google游览器中,右键复制网络抓到的网络请求为cURL(bash)。

然后打开任意一个可以转换的网站,比如这个https://curl.trillworks.com/

将刚刚复制的内容,填写该网站左侧,右侧同时生成了对应的 python requests 代码。

剩下的大家就可以自行选择合适的选择器了,比如正则表达式、BeautifulSoup、Xpath、CSS选择器等等。

是不是方便很多了。

但我们还是不希望来回切换网页,最好都能在Python代码中直接使用。

Python代码中使用

还是希望在Python中直接运行,所以今天给大家介绍的Python库,叫做filestools,由小小明开发,直接使用如下命令,安装后使用。

pip install filestools --index-url=http://mirrors.aliyun.com/pypi/simple -U

这个库一共集成了4个功能,4个库都已经全部迁移到了filestools库中,因此安装这一个库,就可以使用所有的4个功能了,你只需要在使用对应功能,分别导入对应的模块即可。

之前已经给大家安利过图片加水印的功能了,具体见:2行Python给图片加水印,太强了!

4个功能之一的curl2py命令,则是可以将curl命令转换为Python代码[2]

帮助文档如下:

E:\>curl2py -h
usage: curl2py [-h] [-f FILE] [-o OUT] [-t] [-c]

将curl网络请求命令转换成Python的requests库请求代码,-f/-t/-o三个参数均没有指定时,结果将保存到剪切板中

optional arguments:
  -h, --help            show this help message and exit
  -f FILE, --file FILE  被转换的curl命令文件,-o和-t参数均没有指定将保存到对应的同名py脚本中,不指定则从直接对剪切板操作
  -o OUT, --out OUT     生成py脚本的保存位置
  -t, --tmp             py脚本是否保存到当前目录的tmp.py中
  -c, --copy            始终copy结果到剪切板

不过今天我们主要讲,要在Python中直接调用。

只要将刚刚右键复制为cURL(bash)得到的内容,插入下方代码中。

from curl2py.curlParseTool import curlCmdGenPyScript

curl_cmd = '''右键复制为cURL(bash)'''
output = curlCmdGenPyScript(curl_cmd)
print(output)

运行后就可以得到,与前文中转换网站一样的效果了。

将生成的代码复制到代码框里,配合选择器,运行。

response.encoding='utf-8'

#正则匹配
re_name = re.findall('data-val="{movieId:.*?}">(.*?)</a>',response.text)
re_star = re.findall('<p class="star">\n                (.*?)\n        </p>',response.text,re.S)
re_releasetime = re.findall('<p class="releasetime">(.*?)</p>',response.text)
re_integer = re.findall('<i class="integer">(.*?)</i>',response.text)
re_fraction = re.findall('<i class="fraction">(.*?)</i>',response.text)

score =[]
for n in range(len(re_integer)):
    score.append(re_integer[n]+re_fraction[n])

for i in range(len(re_name)):
    content = re_name[i]+' '+score[i]+' '+re_star[i]+'  '+re_releasetime[i]
    print(content)

成功爬取到猫眼榜单数据。

如果你使用 Jupyter Notebook 的话,可以使用插件snippets来自定义代码块,将curl2py这段代码设为模板,实现代码复用。其他编辑器也有类似功能,可以自行搜索。这大大节省了我们的工具效率!

注:如果你还对反向转换感兴趣的话,即requests代码转为CURL命令,可以了解一下curlify模块。

如果你想详细学习filestools库,参考下方网站:https://pypi.org/project/filestools/

参考资料

[1]

阮一峰的网络日志 curl 的用法指南: http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

[2]

filestools 0.1.2: https://pypi.org/project/filestools/



点击这里阅读更多Python文章

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存