如何用python爬取网站信息

如何用python爬取网站信息

我上周接了个活儿,何用要抓某电商平台上一千件商品的网站价格。手动复制粘贴?信息那得干到下周去。Python爬虫五分钟搞定的何用事,为什么要当人肉复制机?网站

核心就三步:发请求拿HTML,解析找数据,信息存下来。何用别想复杂了,网站requests库负责第一步,信息BeautifulSoup干第二步,何用csv模块收尾。网站就这么简单。信息

先装库,何用终端敲两行命令的网站事:pip install requests beautifulsoup4。然后直接上代码——

import requests from bs4 import BeautifulSoup url = "https://example.com/products" headers = { "User-Agent": "Mozilla/5.0"} # 假装自己是信息浏览器 resp = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(resp.text, "html.parser") 

看到没?headers那行不能省。很多网站会拦裸奔的爬虫,带个浏览器标识能省掉80%的403错误。这是我被反爬机制教育过后的血泪经验。

解析这块,你得先打开网页按F12,找到商品价格在哪个标签里。比如价格在<span class="price">里,那就这么抓:

prices = soup.find_all("span", class_="price") for p in prices: print(p.text.strip()) 

注意是class_不是class,后者是Python关键字,写错了直接报语法错误。这种小坑能卡你半小时。

抓下来的数据别只print,存成CSV才有用。用Python自带的csv模块,几行代码就搞定:

import csv with open("prices.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["商品名", "价格"]) writer.writerow(["iPhone 15", "5999"]) 

这里newline=""一定要写,不然在Windows上每行之间会多出个空行。别问我怎么知道的。

真正干活时会遇到更烦的事。比如网站用了JavaScript动态加载,你直接requests拿到的HTML是空的。这时候要么找接口——按F12切到Network面板,看XHR请求,往往能直接拿到JSON数据;要么上Selenium模拟浏览器。能走接口就别上Selenium,后者慢得像蜗牛爬。

还有个经常踩的坑:网站结构变了。上周还能用的选择器,这周就抓不到数据了。所以代码里一定要写异常处理,抓不到就跳过,别让整个程序崩掉。我习惯这样写:

try: price = soup.find("span", class_="price").text except AttributeError: price = "N/A" 

最后说点实在话。爬虫这东西,法律风险得自己掂量。robots.txt要尊重,别把人家服务器爬崩了。设置合理的请求间隔,比如time.sleep(1),既是礼貌也是自我保护。我见过有人用多线程狂爬,结果IP被封了,整个公司网络都上不了那个网站——那场面,相当的尴尬。

爬虫的本质就三件事:伪装成正常访问、找到数据位置、优雅地处理意外。掌握了这些,剩下的就是具体网站具体分析了。遇到问题先看返回的HTML长什么样,别闭着眼睛改代码——八成问题出在数据没加载出来,而不是你的选择器写错了。

代码写完了,跑一遍。看着一千条价格数据哗啦啦流进CSV文件,那种感觉,比手动复制粘贴爽一百倍。