Python技术迷

Python爬虫工作基本流程及urllib模块详解

我之前写这个的时候...应该是上个月在地铁上,耳机没电了然后心情又烦,就想写点轻松点的代码,就写了个小爬虫练手。说真的,其实写个 Python 爬虫啊,没啥神秘的,流程那就是那么几个关键环节,不复杂,真不复杂。

咱们从头说起:流程很像点菜吃饭

你可以把整个爬虫过程理解成一次吃饭:

  1. 你选好要吃哪家店 —— 对应找目标网页的URL;
  2. 跟服务员点菜 —— 发请求(用 urllib、requests 这些);
  3. 菜端上来了你得尝尝 —— 拿到网页源码;
  4. 吃菜挑菜骨头不要 —— 解析你想要的数据;
  5. 吃得开心了打包回家 —— 存储数据(写CSV也好,写库也好)。

基本上逻辑就是这么个事儿。你看,就算你用最原始的 urllib,也都能干这活。虽然很多人喜欢用 requests,图个方便嘛,但 urllib 其实也够用了,而且它是标准库,不用装。

urllib 是啥?就是那个最“正宗”的工具

有一说一,urllib 一开始用着不爽,是真的。你比如说,发送个请求你得写:

from urllib import request
response = request.urlopen('http://www.example.com')
html = response.read().decode('utf-8')

你看这写法是不是比 requests 要啰嗦点?但其实它该干的活一样都不少,连带 headers、cookie、甚至 proxy 都支持的,你要整就能整得明明白白的。

还有那个 urllib.parse,我特喜欢,它干嘛用的?拼URL用的!比如你有一堆查询参数:

from urllib.parse import urlencode

params = {'q': 'python', 'page': 2}
query_string = urlencode(params)

拼出来就是 q=python&page=2,你再一拼 base_url + '?' + query_string 就成一个完整链接了。

处理 headers:让你像“正常人”一样去访问

说真的,有时候你爬某些网站的时候,不加 headers 它直接不给你返回你想要的页面。你就得学着“伪装”一下,告诉对方:“我真的是个浏览器啊”。用 urllib 加 headers 是这样的:

req = request.Request(
    url='http://example.com',
    headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
    }
)
response = request.urlopen(req)

这段写多了你就会写了,其实也不麻烦。

异常处理也别落下

说个笑话,有一次我写了个爬虫,放公司服务器上跑了一晚上,结果中间一个 404 把我整个程序搞挂了,第二天数据啥都没拿回来,差点挨骂。所以后来我都包 try-except:

try:
    response = request.urlopen(req)
except Exception as e:
    print('出错了:', e)

你别嫌啰嗦,这玩意保你命啊。

说说解析这块吧:就是把“饭里的菜挑出来”

数据来了以后,一般你会拿到一大坨 HTML,那你得挑东西吧。这个时候用 lxml、BeautifulSoup 这些都行,随你喜欢。但你得知道爬虫流程里,这步是“眼睛”,你不看网页源代码,不知道你该提哪块,那你真啥也干不了。

而 urllib 是爬虫流程里负责“嘴”的那个,去咬网页的,吃下来给你,你自己再挑。

其实也没啥总结的,就是想说:你别一上来就觉得“写爬虫”是个很厉害的事儿,它真就是一件流水线的事。urllib 虽然比 requests 繁琐,但它够“原生”,而且能干的事儿也不少。你只要把整个流程搞清楚,从访问到解析到存储,后面你换个框架、甚至写异步爬虫,那都只是流程上的升级,基础都一样。

好了,差不多就这样,哦对了,我回头把我那个爬 B站热搜的小脚本整理一下,贴群里给你们看看,反正也没几行代码~

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领