Python技术迷

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

昨天晚上不是加班嘛,在公司楼下点了杯咖啡,正好我们组那个小王问我:你平时写爬虫用什么?我说啊,说实话,简单的需求我直接就用Python自带的urllib了。真没必要一上来就用requests,requests挺好,但是urllib自带的都能搞定,还不用额外装包,你懂的吧,有时候环境管控比较严格。

然后说到爬虫流程,唉,先别急,这玩意其实没啥神秘的。就几步,真的,就像你吃火锅一样,先洗菜、再下锅、最后蘸料,别整那么玄乎。

爬虫基本流程

就比如说你现在想爬点啥数据,比如豆瓣的电影榜单,正常你得先有个目标网页对吧。然后你就拿Python,把网页请求下来。大致的顺序其实就是:

  1. 确定目标:你得知道你想爬哪个页面或者API。
  2. 发请求:这不就是urllib.request嘛,请求下页面。
  3. 解析内容:通常拿回来的是HTML,得用正则、BeautifulSoup或者lxml啥的去扒拉。
  4. 保存数据:有的存csv,有的直接存数据库,也有直接扔控制台上的,反正看心情。
  5. 异常处理/反爬应对:有些站点整点花活儿,比如加点User-Agent,有的还验证Cookie,这些都得自己琢磨。

你看啊,说着说着,我得举个例子,你要不用urllib请求个网页?大概这样:

import urllib.request

url = 'https://movie.douban.com/top250'
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html[:500])  # 先看看前500个字符,别全打印

你就看上面这几行,真没什么复杂的,urlopen就把网页内容直接爬下来了。有人问说万一页面打不开呢?你就加个try-except呗,别傻傻地让程序崩了。

urllib模块几个常用功能

其实urllib分好几个子模块,你看平时主要用的就是urllib.request,剩下的比如urllib.parse你要处理url拼接的时候贼方便,尤其是拼参数那种。

就举个例子哈,有一次我写个东西,需要拼接参数,那会还傻乎乎地手写拼字符串,结果拼出bug一堆。后来用urllib.parse.urlencode就舒服多了:

from urllib.parse import urlencode

params = {'q': 'python爬虫', 'page': 2}
base_url = 'https://www.example.com/search?'
full_url = base_url + urlencode(params)
print(full_url)
# 输出: https://www.example.com/search?q=python%E7%88%AC%E8%99%AB&page=2

再比如,有些网站没有把所有页面都放在一个页面里,它给你一堆下一页的链接,你点点点能点到天亮。那怎么办?一般要用urllib.parse.urljoin来拼接URL,保证每次都能点到下一个页面,不至于走丢。

from urllib.parse import urljoin

base = 'https://movie.douban.com/top250'
next_page = '/top250?start=25'
full_url = urljoin(base, next_page)
print(full_url)
# 输出: https://movie.douban.com/top250?start=25

设置请求头那些事儿

说实话啊,你不加User-Agent的话,很多网站直接给你返回个403。尤其像豆瓣这种,它一看你不像正常浏览器访问,直接就把你拦了。所以有时候要假装自己是个人类,给它加个请求头:

import urllib.request

url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')

这样搞,八九不离十就能正常访问了。当然,有的网站还玩Cookie,甚至搞点更高阶的反爬策略,那就得自己再研究,比如用代理,甚至加验证码识别啥的。不过你日常爬点公开数据,这种写法一般够用。

反正我觉得,写爬虫真没必要神化它,别一说就是啥"黑科技"、"逆天神器"那种标题党。其实就是你平时上网点网页——让Python帮你自动点而已。urllib能搞定的,别折腾requests。实在有需要再升级,没必要一上来就拉一堆第三方包,连安装包都得靠翻墙,搞得自己很高端一样。

哦对了,差点忘了,urllib其实还支持文件下载啥的,你直接用urlretrieve就能下文件,比如图片啥的:

import urllib.request

url = 'https://www.example.com/logo.png'
urllib.request.urlretrieve(url, 'logo.png')

你看,代码就这几行,别太较真。今天就先说这么多吧,谁还没点事干去,等下还得去接孩子放学,咱们有啥再群里继续聊哈。

-END-

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

🔥虎哥私藏精品🔥

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