python简单爬虫代码
凌晨两点,简单我盯着终端里滚动的爬虫数据流,三百条商品信息正从某电商页面被拖进本地数据库。代码写这段爬虫只花了二十分钟,简单但调试反爬机制用掉整个晚上——这大概是爬虫所有爬虫初学者的第一课:代码本身从来不是难点,难点在于对方不想让你爬。代码
先看最基础的简单版本。用requests库抓取网页,爬虫BeautifulSoup解析HTML,代码十几行就能跑通。简单
import requests from bs4 import BeautifulSoup url = 'https://example.com' headers = { 'User-Agent': 'Mozilla/5.0'} resp = requests.get(url,爬虫 headers=headers) soup = BeautifulSoup(resp.text, 'html.parser') for item in soup.select('.product-title'): print(item.text.strip()) 这段代码能工作,但只对静态页面有效。代码真实世界的简单网页早就不是这样了——数据藏在JavaScript渲染后的DOM里,或者接口返回的爬虫JSON中。我最初爬某个新闻站点,代码直接抓HTML只能拿到页面框架,文章内容全是空的。后来打开浏览器的开发者工具,在Network面板里找到真正的数据接口,改用requests直接请求那个API,问题迎刃而解。
处理动态加载内容时,selenium是另一种选择。它模拟真实浏览器操作,能执行JavaScript,代价是速度慢、资源占用高。我通常只在目标网站有复杂交互(比如点击"加载更多"按钮)时才用它。
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://example.com') for _ in range(5): driver.find_element(By.CLASS_NAME, 'load-more').click() time.sleep(2) items = driver.find_elements(By.CSS_SELECTOR, '.data-item') 真正让人头疼的是反爬策略。有个招聘网站会检查请求频率,超过每分钟十次就封IP。我试过添加随机延时、轮换User-Agent,甚至用代理池,但最有效的反而是降低采集频率——反正数据更新没那么快,慢一点反而更稳定。
还有一次,目标网站返回的数据明显被篡改了。价格字段全部变成0,商品名称是乱码。后来发现对方检测到非浏览器请求,返回了混淆数据。解决办法是补全headers里的Accept、Referer等字段,模拟真实浏览器的完整请求头。
写爬虫时还得考虑数据存储。简单场景直接存CSV,数据量大就用SQLite。我习惯把抓取结果先存成JSON文件,方便中途检查数据质量,确认无误后再导入正式数据库。
import csv with open('output.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['标题', '价格', '链接']) for item in data_list: writer.writerow([item['title'], item['price'], item['url']]) 最后说点个人看法。爬虫本质是逆向工程,考验的是观察力和耐心。碰到反爬时,先别急着写代码,花时间分析对方的技术栈——看响应头里的Server字段,查页面加载的JS文件,这些线索往往比盲目试错更管用。
我的经验是:能直接请求API就别解析HTML,能解析HTML就别上浏览器自动化。工具选得越简单,后期维护越省心。当然,爬虫的合法性边界要自己把握,robots.txt是底线,别碰需要登录才能访问的数据,更别对服务器造成压力。技术本身没有善恶,但用技术的人得有点分寸。
