Python技术迷

如何使用Python进行Web爬虫?

那天在咖啡店坐着点单,隔壁桌有两个刚入行的小兄弟在那研究爬虫,结果有个说“Python写爬虫是不是要配VPN才行啊?”。听得我一愣,差点把咖啡喷出来。你说这写爬虫吧,其实一点不神秘,没那么多玄乎的事儿。就像平时你打开浏览器逛淘宝,其实你浏览器干的事,Python爬虫一样能干,就是你自己写代码模拟一下浏览器的行为。写这个东西,真的就跟你在公司茶水间里跟同事吹牛一样简单——当然,坑也挺多,尤其被封IP那种,很烦人。

最简单的爬虫是啥样?

我记得有一次快下班,同事小张问我:“老哥,有没有那种一键就能爬网页的代码?”我直接随手扒拉了几行给他看——用requests库,五秒钟搞定一切。

import requests

url = 'https://www.example.com'
response = requests.get(url)
print(response.text)

这玩意儿只要你装了requests,基本啥都不用想。response.text就是你网页看到的那堆HTML源码。小张当时还问,这和浏览器有啥区别?其实浏览器加载图片、脚本啥的你都看不见,requests就把所有东西都当成文本拉回来了,简单粗暴,适合入门。

页面上数据怎么提取?

不过很多网站,像那种电商详情页,数据藏得贼深,全是div、span里包着的。之前有个前端朋友还笑我,Python爬虫写得再溜,看不懂前端结构照样跪。其实说实话,提数据我一般就两个库:BeautifulSoup和lxml,够用了。

比如你想把页面上所有标题全爬下来,随便举个栗子:

from bs4 import BeautifulSoup

html = '<html><body><h1>hello</h1><h1>world</h1></body></html>'
soup = BeautifulSoup(html, 'html.parser')
for h1 in soup.find_all('h1'):
    print(h1.text)

正常人都能看懂吧,这其实比正则靠谱多了,正则写多了眼睛都瞎。遇到更复杂点的表格、嵌套,lxml直接xpath暴力提,代码差不多:

from lxml import etree

html = '<html><body><h1>hello</h1><h1>world</h1></body></html>'
tree = etree.HTML(html)
for node in tree.xpath('//h1'):
    print(node.text)

我个人习惯是两者混着用,反正哪个顺手用哪个。

有些网页“看不见”怎么办?

最气人的就是那种打开页面啥都没有,F12一看,原来一堆内容都是js渲染出来的。比如之前想爬B站评论,你requests过去,啥都没有,全靠JS生成。这个时候就得用Selenium,模拟一个浏览器,甚至还能操作鼠标键盘那种。

我自己平时写爬虫,遇到真没办法才用Selenium。比如下面这种:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.page_source)
driver.quit()

不过Selenium巨吃资源,慢得一批。就像你每次都开一个完整的浏览器一样,不是真到没招别乱用。

反爬虫怎么破?

讲真,现在网站都不傻。你爬多了,一看请求头不对、频率太高、IP太活跃,分分钟给你封。最基础的,headers伪装一下是基本操作,比如:

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
requests.get(url, headers=headers)

再就是加点延时,别秒爬秒死。时间充裕的就加点time.sleep(random.uniform(1, 3)),装得像个人类点。

要是还不行,那就得上代理池了,不过这个事我真觉得,一般用不到,除非是搞什么全网监控那种。

爬图片、文件咋整?

写着写着饿了,突然想到上次写图片爬虫是为了爬美食图片,搞得凌晨两点饿得不行。其实图片、PDF啥的都一样,只不过不是.text,而是.content。

import requests

img_url = 'https://www.example.com/image.jpg'
response = requests.get(img_url)
with open('image.jpg', 'wb') as f:
    f.write(response.content)

下文件就这一套模板,随便用。

抓包抓接口算不算爬虫?

很多时候页面上看不到数据,但抓包一看,原来数据全是接口返回的json。前两天同事说公司内网系统加了验证码,其实接口还是能直接调——这种情况爬起来反而更简单。

import requests

api = 'https://api.example.com/data'
resp = requests.get(api)
print(resp.json())

只要没加token、没加复杂的校验,基本都是白给。

反正Python爬虫这玩意吧,说难也难,说简单也简单,坑全在细节。大部分坑,都是被网站防护给卡住的。再不行就多换几个User-Agent,多试几个代理,真不行就睡觉别搞了,哈哈。

-END-

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

🔥虎哥私藏精品🔥

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