探索

用python写网络爬虫代码

时间:2010-12-5 17:23:32  作者:综合   来源:百科  查看:  评论:0
内容摘要:```html 凌晨两点,我盯着屏幕上的403错误码,第三次尝试用requests库直接抓取某电商平台商品页。结果还是被拦了。这让我想起一年前刚学爬虫时,以为只要会get请求就能搞定一切——直到被反爬

```html

凌晨两点,网络我盯着屏幕上的爬虫403错误码,第三次尝试用requests库直接抓取某电商平台商品页。代码结果还是网络被拦了。这让我想起一年前刚学爬虫时,爬虫以为只要会get请求就能搞定一切——直到被反爬机制教育了整整两周。代码

真正的网络爬虫代码,从来不是爬虫从import requests开始的。先看目标网站的代码结构,再决定用requests还是网络scrapy。比如静态页面,爬虫requests加BeautifulSoup就够了。代码但像知乎这种大量JS渲染的网络站点,你得用selenium模拟浏览器操作。爬虫别一上来就套框架,代码先用手动分析工具看看网络面板里实际发了哪些请求。

import requests from bs4 import BeautifulSoup url = 'https://example.com/books' headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9' } resp = requests.get(url, headers=headers, timeout=10) resp.raise_for_status() soup = BeautifulSoup(resp.text, 'html.parser') for item in soup.select('.book-item'): title = item.h2.text.strip() price = item.find('span', class_='price').text print(f'{ title}: { price}')

这段代码能跑通的前提是——对方网站没有设置robots.txt限制,也没做IP频率检测。我踩过的坑是,写完解析逻辑后,忘了处理resp.encoding。有的网站用GBK编码,直接拿UTF-8解析中文就会乱码。现在我会先打印resp.apparent_encoding看看。

写爬虫最耗时间的部分是数据清洗。上个月爬某招聘网站时,职位描述里混着各种换行符和HTML标签。用正则或者BeautifulSoup的get_text()方法能解决大部分问题。但有些字段是动态加载的,比如翻页按钮的下一页链接,需要从json接口里提取。

# 处理分页的实际例子 for page in range(1, 6): params = { 'page': page, 'size': 20} resp = session.get(api_url, params=params) data = resp.json() if not data['items']: break for item in data['items']: save_to_db(item) time.sleep(2) # 礼貌性等待,别打太快

这里有个个人经验:控制请求频率比换代理IP更重要。我见过有人用多线程抓取,结果半小时就把对方服务器搞崩了,最后收到律师函。爬虫的本质是模拟人类浏览,所以随机延时2-5秒是常态。偶尔用time.sleep(random.uniform(1,3))会更自然。

还有个细节容易被忽略——session对象的使用。如果你需要登录后才能访问数据,先模拟登录拿到cookie,然后一直用同一个session实例发请求。别每次get都新建requests对象,那样cookie就丢了。

import requests session = requests.Session() login_data = { 'username': 'my_account', 'password': 'secret'} session.post('https://example.com/login', data=login_data) # 之后用session.get()保持登录状态 resp = session.get('https://example.com/profile')

写到这里,突然想起去年写爬虫时遇到的一个怪事。有个网站的响应内容用gzip压缩,但没在header里声明。结果解析出来全是乱码。后来手动解压才搞定:

import gzip if resp.headers.get('Content-Encoding') == 'gzip': html = gzip.decompress(resp.content).decode('utf-8') else: html = resp.text

最后说个反直觉的观点:爬虫代码里,错误处理比抓取逻辑更重要。因为网站改版是常态,今天能跑通的CSS选择器,明天可能就失效了。所以写代码时,最好把解析逻辑封装成函数,并加上try-except。别怕异常,异常是你的朋友——它能告诉你哪里需要调整。

现在回头看,真正实用的爬虫代码其实很朴素。没有花哨的异步,没有复杂的分布式。就是老老实实分析请求,构造合理的headers,写清晰的解析逻辑,再加点容错机制。如果你要抓的数据量不大,单机单线程完全够用。别被那些“百万级爬虫架构”的文章吓到,先从抓100条数据开始练手吧。

```
最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap