Python3 写爬虫的实践与经验分享

这几天学习写爬虫使用 py2 和 py3 但是使用 urllib 的时候问题 urllib2 用 python 获取异常但是使用 python3 的时候不是 urllib 和 urllib2 都打包成 urllib 了吗,结果死活调不了 urlerro,书上都是用 pytjon2 但是像 2 和 3 一起搞各位打来有没有好的方法。


Python3 写爬虫的实践与经验分享
62 回复

我大清亡了吗


我最近也在用Python3写爬虫,分享点实战经验。

核心库选择

  • requests + BeautifulSoup:适合静态页面,简单直接
  • Scrapy:大型项目首选,自带异步、中间件等完整体系
  • aiohttp + asyncio:高并发场景,性能最好

关键代码示例(requests+BeautifulSoup):

import requests
from bs4 import BeautifulSoup
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

def get_page(url):
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.raise_for_status()
        resp.encoding = resp.apparent_encoding
        return resp.text
    except Exception as e:
        print(f"请求失败: {e}")
        return None

def parse_html(html):
    if not html:
        return []
    
    soup = BeautifulSoup(html, 'lxml')
    items = []
    
    # 假设抓取文章标题和链接
    for article in soup.select('.article-list li'):
        title = article.select_one('h3 a').text.strip()
        link = article.select_one('h3 a')['href']
        items.append({'title': title, 'link': link})
    
    return items

# 使用示例
if __name__ == '__main__':
    url = 'https://example.com/news'
    html = get_page(url)
    if html:
        data = parse_html(html)
        for item in data[:5]:  # 只打印前5条
            print(f"标题: {item['title']}")
            print(f"链接: {item['link']}\n")
    time.sleep(1)  # 礼貌延迟

实战要点

  1. 反爬应对:随机User-Agent、代理IP池、请求间隔
  2. 数据解析:优先用CSS选择器,xpath备用
  3. 异常处理:网络超时、解析失败都要有兜底
  4. 存储选择:小数据用JSON/CSV,大量数据直接入数据库
  5. 遵守robots.txt:别给人家服务器添乱

异步爬虫简单示例

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as resp:
        return await resp.text()

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        return await asyncio.gather(*tasks)

# 运行:asyncio.run(main(url_list))

个人建议:从requests开始练手,熟悉了再上Scrapy框架。

合并了就文档啊。
再说 Python3 没有了编码的后顾之忧,写起来不知道有多爽。
再再说,不用 requests 吗?

提问请好好组织下语言和使用标点符号,否则只是浪费大家的时间。

requests 了解一下。不过我问一下,服务器怎么安装 python3 环境比较方便

提问请好好组织下语言和使用标点符号,否则只是浪费大家的时间。

各有优势吧
用 2 写的话部署起来比较方便
用 3 写的话不用处理那么多编码问题,3 部署起来稍微有些麻烦些

你这说的是中文吗…

难道还有用 Python2 的嘛?

一大串看的头晕

这年头还有用 py2 的吗。。。


我们公司也是被逼着用 2,毕竟客户内部也是用 2。而且客户还是做系统的

标题改为"话说大家写爬虫有用 python2 的嘛"就正常多了

公司用的是 2.因为部署方便,也没有升级的动力,

直接 3 吧,毕竟 2 马上要退出舞台了

python 2 不是快淘汰了吗?大批的库已经放弃 python2 ?

一直用 Python 3 写爬虫。

那么多大神,为啥就不能弄出来一个简单的部署的办法那,比如来个一键部署之类的,想不明白啊

8012 年了

大清亡了吗? urllib 这几个库我们不都应该默认无视吗?

用 pyenv

作者:alexsunmiu
链接: https://www.zhihu.com/question/38081354/answer/76689956
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python 应用的部署是一个很大的话题,至少是比较复杂的事情,现行的方案大多只是解决了某一方面的问题,或者把某个复杂的问题变成了另一个复杂的问题(或另一种复杂)罢了。抛砖引玉,为什么 Python 应用的部署会成为一个问题?这里暂时只谈服务端部署,毕竟 Py 目前在服务端的应用还是居多,PyQt 之流暂不讨论。讨论时主要与 PHP 与 Java 做比较,Ruby 高度类似 Py 不参与,GoLang 等则会编译至二进制可执行文件,可比较性不大。同时的同时,这里。。。只挖坑不管埋,下面这些问题,我也没想明白,尚未找到一个万全之策。那么,为什么 Python 应用的部署会成为一个问题呢?首先的首先,Python 服务端应用的部署处于一个两难的境地,既不像 PHP 那样丢文件到服务器就行,也不像 Java 那样有个标准的规范可以直接打包到 war。造成了部署复杂这一固有印象,同时另一些问题下,导致这个问题更加复杂。1,操作系统问题,PHP 可以非常容易的与 IIS 共处,但 Python 的 IIS 库(虽然貌似只支持 django )似乎已经烂尾了,几乎已经没有人在 windows 下做生产部署了,同时去看看各云服务器厂商,观察他们的 windows server 的销量就知道这个问题有多严重了。但同时 J2EE 在 windows 下依然可以很欢快,很多人认为 PHP 比 Py 更流行的原因在于 windows 下的执行环境。2,需求的多样化加剧了这个问题,py 生态中对于性能的追求很过分,有几多 Py web 框架数得过来吗,每个 web 框架的运行环境甚至原理完全不一样,举栗子,wsgi、uwsgi、fastcgi 都是可以的,django、flask、web.py 、bottle 这些鼎鼎大名的 web 框架还只能简单归于一类,tornado、twisted web 等再归于一类,部署他们与部署 wsgi app 完全不同的,好复杂。甚至的甚至,一个 Web 开发我们将之拆分成 framework、template engine,ORM 等等好些部分,谈到这个问题我只想说,我想静静。

尽信书不如无书

不如看书后照着自己的想法先 XJB 撸一通,然后找其他资料慢慢完善。

比如这个 从零开始写一只爬虫 系列

而且……为啥要用 Windows10 …… 人家 Windows98 多流畅啊,资源消耗又少……

用 requests 吧,我入手就是 py3

什么?我大清亡了?

requests 挺好的

用 requests 吧…公司还在用 2 估计是迁移成本太高…心累

#4 pyenv 了解一下

request-html 挺好用的啊, 只支持 py3.6+

很少有用 3 的,用 2 吧

一直用 py3+requests+pymysql

最近给公司写的项目一律用 py3
不知道楼上说的部署问题是啥问题 我真没碰到有部署难的 应该说 跟 py2 没区别啊 装个 pip3 依赖放 requirements.txt 里 讲究的人还要弄个 virtualenv 还有啥?


很多系统上是没有 3 的 pip 的 还要重新整 3 的环境,2 是连 virtualenv 都不用的 放机器上直接就写个 sh 就能一直跑了
相比之下多了不少步骤的




你们用 requests 的时候,网页读取超时如果解决的?不是链接超时,timeout 默认是链接超时,timeout=(3,9),这样是链接超时 3 秒,读取超时 9 秒,但是我自己测试发现读取超时没啥卵用诶

写爬虫还有直接用 urllib 的?

都 8102 年了,还在 py2 ?写爬虫当然用 scrapy 啊

我用的 2,不知道别人

学的就是 3

py3 的 aiohttp 多好用

自己写了个 request,把常用的功能整合进去,json 完整性、返回错误排除、自动重新请求、代理服务器轮换等等,每次爬用自己的一套。从 2 换到 3 没费太大功夫。

入门时候是 py2,去公司开始生产就是 py3

8012 年不用 3 ?

现在还是 2…

语言表达能力堪忧

干嘛不用 docker

大学二级 python 都是 3 了。。。

不好意思,我只会 requests,只会 Python3,虽然我发现公司的代码还是 Python2

不给你一键部署其实是节省你的时间啊。趁早放弃

建议看看 k 神的 requests,然后回来重新组织下语言

django,scripy,requests,bs 都支持 py3,还有什么理由不用呢?

用过 python 吗?

肯定用 py3 了 没有烦人的编码问题

urllib2 ??这玩意居然还有人用来写爬虫

忠告,用 pyenv 吧,不要去升级系统的 python2

用 python2 的,
不知道你们对 3.6 的 type hints,也就是类型注解怎么看
反正我在的小公司, 强制使用这个.
定义变量 函数返回值一律使用类型注解.

为什么大家都推荐 requests 而不是 scrapy ?

别用 2 了 马上不支持维护更新了

这俩完全不是一个方面的东西。大家推荐 requests 并不代表不推荐 scrapy,都是你自己脑补的

py3 部署难在那里?

没有 pip3 你不能装一个么?
一行命令的事 你应该不是穿越过来的吧

<br>sudo apt install -y pip3 python3-dev<br>

其他系统也是大同小异啊 我的手机上都直接支持

难道不是 selenium?

回到顶部