搜索

python爬虫代码完整版

发表于 2026-10-17 06:17:05 来源:烟消火灭网

用requests + BeautifulSoup抓取豆瓣读书Top250,爬虫代码不到30行,代码跑一遍就能拿到250本书的完整名称、评分和链接。爬虫这是代码最基础的爬虫形态,但已经覆盖了80%的完整日常需求。

import requests from bs4 import BeautifulSoup import time headers = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML,爬虫 like Gecko) ' 'Chrome/120.0.0.0 Safari/537.36' } for page in range(0, 250, 25): url = f'https://book.douban.com/top250?start={ page}' resp = requests.get(url, headers=headers) soup = BeautifulSoup(resp.text, 'html.parser') for item in soup.select('tr.item'): title = item.select_one('div.pl2 a')['title'] rating = item.select_one('span.rating_nums').text link = item.select_one('div.pl2 a')['href'] print(title, rating, link) time.sleep(1) 

这段代码有几个地方值得说。headers里的代码User-Agent必须加,不加豆瓣直接返回418。完整time.sleep(1)是爬虫礼貌,也是代码保命——请求太密IP会被封。select选择器比find_all好写,完整CSS语法写起来顺手。爬虫

豆瓣的代码HTML结构改过好几次。早些年书名在a标签的完整文本里,现在挪到了title属性。爬虫代码不是一劳永逸的东西,目标网站一改版,选择器就得跟着调。我习惯先把页面下载到本地,用浏览器开发者工具确认结构,再写解析逻辑。直接对着代码盲写,调试成本更高。

遇到JavaScript渲染的页面,requests就拿不到数据了。比如抓知乎的推荐流,返回的HTML里根本没有内容。这时候得上selenium或者playwright。

from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto('https://example.com/ajax-page') page.wait_for_selector('.content-item') items = page.query_selector_all('.content-item') for item in items: print(item.inner_text()) browser.close() 

playwright比selenium快,API也更干净。headless=True在服务器上跑没问题,但有些网站会检测无头浏览器,得加--disable-blink-features=AutomationControlled之类的启动参数。

数据量大了要存下来。CSV最简单,pandas两行搞定:

import pandas as pd df = pd.DataFrame(results, columns=['title', 'rating', 'link']) df.to_csv('douban_books.csv', index=False, encoding='utf-8-sig') 

utf-8-sig带BOM头,Excel打开不乱码。这个坑我踩过好几次,用utf-8存的中文CSV在Windows上双击打开全是乱码。

反爬是绕不开的话题。除了User-Agent,还有几个常规操作:用代理池换IP、随机化请求间隔、处理Cookie。豆瓣对频率敏感,我试过不加延时连续请求,大概第7页就返回403了。加1秒延时能稳定跑完10页。代理池用付费的质量更稳,免费代理大部分不能用,浪费时间。

最后说个实际问题。爬虫写出来容易,维护麻烦。目标网站改版、加验证码、封IP,任何一条都能让代码失效。我的做法是把解析逻辑和请求逻辑分开,网站改版只改解析部分。再就是加日志,哪一页失败了、返回状态码是多少,记下来方便排查。

代码不用追求一次写完美。先跑通,再优化。能拿到数据就是好爬虫。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by python爬虫代码完整版,烟消火灭网   sitemap

回顶部