问题

如何入门 Python 爬虫?

回答


入门Python爬虫需要从基础概念、工具使用、代码实践和法律注意事项等方面系统学习。以下是详细步骤和资源推荐:



一、前期准备
1. 安装Python环境
官网下载:https://www.python.org/downloads/
验证安装:打开命令行输入 `python version` 或 `python3 version`
安装pip(Python自带):`python m ensurepip upgrade`

2. 安装必要库
requests:发送HTTP请求
```bash
pip install requests
```
BeautifulSoup:解析HTML
```bash
:
pip install beautifulsoup4
```
lxml(可选):更高效的HTML解析器
```bash
pip install lxml
```
Scrapy(进阶):强大的爬虫框架
```bash
pip install scrapy
```
Selenium(动态页面):模拟浏览器操作
```bash
pip install selenium
```



二、基础概念
1. HTTP请求与响应
GET请求:获取网页内容
```python
import requests
response = requests.get('https://example.com')
print(response.status_code) 200表示成功
```
响应内容:`response.text`(文本)或 `response.content`(二进制)

2. HTML解析
BeautifulSoup示例:
```python
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.find('h1').text
print(title)
```
选择器:`find()`, `find_all()`, `select()`(CSS选择器)

3. 数据提取
文本提取:
```python
links = soup.find_all('a') 所有超链接
for link in links:
print(link.get('href'))
```
数据存储:
CSV:
```python
import csv
with open('data.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Link'])
writer.writerow([title, link])
```
JSON:
```python
import json
data = {'title': title, 'link': link}
with open('data.json', 'w') as f:
json.dump(data, f)
```



三、进阶实践
1. 处理动态网页(JavaScript加载内容)
Selenium示例:
```python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')
print(driver.find_element('xpath', '//h1').text)
driver.quit()
```
Scrapy示例(需配置`settings.py`):
```python
import scrapy

class ExampleSpider(scrapy.Spider):
name = 'example'
start_urls = ['https://example.com']

def parse(self, response):
yield {'title': response.xpath('//h1/text()').get()}
```

2. 反爬虫机制应对
UserAgent轮换:
```python
headers = {
'UserAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
}
```
IP代理:使用 `requests` + 代理IP库(如 `proxies` 参数)
验证码处理:使用第三方服务(如 2Captcha)或人工识别。

3. 分页与数据处理
分页示例:
```python
for page in range(1, 6):
url = f'https://example.com/page/{page}'
response = requests.get(url)
解析并保存数据
```
数据去重:使用 `set()` 或数据库唯一性约束。



四、法律与伦理注意事项
1. 遵守robots.txt:https://example.com/robots.txt
禁止爬取的路径:`Useragent: Disallow: /private/`
2. 设置请求头:模拟浏览器访问
```python
headers = {
'UserAgent': 'Mozilla/5.0',
'AcceptLanguage': 'enUS,en;q=0.9'
}
```
3. 速率限制:避免频繁请求
```python
import time
time.sleep(2) 每2秒请求一次
```
4. 尊重网站政策:避免对服务器造成压力,遵守网站的爬虫规则。



五、学习资源推荐
1. 书籍:
《Python网络爬虫技术详解》(作者:李宁)
《Scrapy爬虫开发实战》
2. 在线教程:
[Requests官方文档](https://docs.pythonrequests.org/)
[BeautifulSoup官方文档](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
[Scrapy官方教程](https://scrapy.org/)
3. 实战项目:
爬取豆瓣电影Top250
爬取淘宝商品信息(需处理反爬虫)
爬取新闻网站并保存到数据库



六、进阶方向
1. 分布式爬虫:使用ScrapyRedis + 框架(如Django)
2. 数据清洗:使用正则表达式(`re`模块)或Pandas处理数据
3. 自动化工具:结合定时任务(如APScheduler)或Web框架(Flask)构建爬虫服务。



七、常见问题与解决
编码错误:使用 `response.encoding = 'utf8'` 或自动检测 `chardet`。
页面加载失败:使用Selenium或ScrapySplash处理JavaScript渲染。
IP被封:使用代理池(如HttpProxyPool)或更换UserAgent。



通过以上步骤,你可以逐步掌握Python爬虫的核心技术,并根据需求扩展到复杂场景。建议从简单网页开始练习,逐步过渡到动态页面和分布式爬虫。

网友意见

user avatar

呃本来只是想给题主一个传送,因为本身也是一个Python爱好者。

简单介绍一下我的那个入门教程,其实根本算不上教程,基本上算是一个学习的笔记,很多内容都是从网上整理然后自己实践得到的结果。

如果说深入学习爬虫,还是建议那本《自己动手写网络爬虫》,是我的启蒙教程,语法是Java的,但是思路是相通的。

Python爬虫的学习,最主要的是多摸索,多试验(哪个不是这样)。先从最简单的例子做起,比如爬取百度主页,爬取百度图片,然后正则,巴拉巴拉。

我的学习笔记可以作为一个参考的索引,里面很多东西没有深入探讨,因为毕竟当时我也只是一个小菜(现在也差不多)。

给初学者一个入门的途径,接下来的路还是要自己走^_^

至于匿名、个人习惯潜水。

继续匿了。



推荐一本朋友写的爬虫教程,崔庆才 著,Python 3网络爬虫开发实战。

利益相关:作者是我学弟。





以前写过一个爬虫入门的系列,传送:专栏:Python爬虫入门教程
一共12篇:
[Python]网络爬虫(一):抓取网页的含义和URL基本构成

[Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容

[Python]网络爬虫(三):异常的处理和HTTP状态码的分类

[Python]网络爬虫(四):Opener与Handler的介绍和实例应用

[Python]网络爬虫(五):urllib2的使用细节与抓站技巧

[Python]网络爬虫(六):一个简单的百度贴吧的小爬虫

[Python]网络爬虫(七):Python中的正则表达式教程

[Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析

[Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析

[Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)

[Python]网络爬虫(11):亮剑!爬虫框架小抓抓Scrapy闪亮登场!

[Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程

比较入门,不过多接触一些小demo没有坏处哈

user avatar

谢邀!

爬虫系统基本的结构:

1.页面下载程序;

最简单的工具就是urllib、urllib2。这两个工具可以实现基本的下载功能,如果进阶想要异步可以使用多线程,如果想效率更高采用非阻塞方案tornado和curl可以实现非阻塞的下载。

2.链接发掘程序;

要想在页面中找到新链接需要对页面解析和对url排重,正则和DOM都可以实现这个功能,看自己熟悉哪一种。

正则感觉速度较快一些,DOM相对较慢并且复杂一点,如果只是为了要url正则可以解决,如果还想要页面中其他的结构或者内容DOM比较方便。

url的排重两小可以用memcache或者redis,量大就要用到bloomfilter。

3.网页存储等部分组成;

抓的少怎么存都行,抓的多并且要方便读取那就要好好设计了,用哈希分布存储在RDBMS上或者直接存在HBase上都要看你的数据量和具体需求。

user avatar

“入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。

另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D

看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。

先长话短说summarize一下:

你需要学习

  1. 基本的爬虫工作原理
  2. 基本的http抓取工具,scrapy
  3. Bloom Filter: Bloom Filters by Example
  4. 如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq: github.com/nvie/rq
  5. rq和Scrapy的结合:darkrho/scrapy-redis · GitHub
  6. 后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)


以下是短话长说:

说说当初写的一个集群爬下整个豆瓣的经验吧。

1)首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。

在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。

突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。

好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。

那么在python里怎么实现呢?

很简单

       import Queue  initial_page = "http://www.renminribao.com"  url_queue = Queue.Queue() seen = set()  seen.insert(initial_page) url_queue.put(initial_page)  while(True): #一直进行直到海枯石烂     if url_queue.size()>0:         current_url = url_queue.get()    #拿出队例中第一个的url         store(current_url)               #把这个url代表的网页存储好         for next_url in extract_urls(current_url): #提取把这个url里链向的url             if next_url not in seen:                       seen.put(next_url)                 url_queue.put(next_url)     else:         break      

写得已经很伪代码了。

所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。

2)效率
如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。

问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。

通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example

注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]


好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。

3)集群化抓取
爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...

那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?

我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)


考虑如何用python实现:
在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。


代码于是写成

       #slave.py  current_url = request_from_master() to_send = [] for next_url in extract_urls(current_url):     to_send.append(next_url)  store(current_url); send_to_master(to_send)  #master.py distributed_queue = DistributedQueue() bf = BloomFilter()  initial_pages = "www.renmingribao.com"  while(True):     if request == 'GET':         if distributed_queue.size()>0:             send(distributed_queue.get())         else:             break     elif request == 'POST':         bf.put(request.url)                



好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub

4)展望及后处理
虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。

但是如果附加上你需要这些后续处理,比如

  1. 有效地存储(数据库应该怎样安排)
  2. 有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)
  3. 有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...
  4. 及时更新(预测这个网页多久会更新一次)


如你所想,这里每一个点都可以供很多研究者十数年的研究。虽然如此,
“路漫漫其修远兮,吾将上下而求索”。

所以,不要问怎么入门,直接上路就好了:)

如果学完了爬虫你对搜索引擎还感兴趣,也欢迎阅读我正在写的教程:

我会一直更新,我自己的公号 HiXieke 里也会不断更新发布,欢迎关注。其它答案和文章:

user avatar

——————最重要的话写在前面——————

0、新手/喜欢练习/欢迎交流/邀请/我是看着这个问题下面的答案学习的

1、带着一个目的来学爬虫。#我的目的实现了…所以我来写这个回答了。

2、不要怂就是干!系统学习固然好,直接写一个项目出来效果更加简单粗暴!(不过自己现在的水平写出来都是流水一般的面向过程的代码,代码的重复部分太多,正在回过头去学习面向对象编程,学习类和方法的使用。不过我还是坚定地认为入门的时候应该直接简单粗暴地实践一个项目

3、哪里不会搜哪里!哪里报错改哪里!相信我你遇到的99%的问题都能从网上找到相似的问题,你需要做的就是写代码!搜问题!调BUG!你搜不到解决办法的情况下,80%的情况是你搜索的姿势不对,另外20%可能需要你自己动动脑子,换个思路去做。

举个印象最深的例子。

我在统计知乎回答voters的具体情况的时候(后面会介绍)发现知乎的数据是这样发送的。

zhihu.com/answer/152197

什么鬼(摔)。

等到我辛辛苦苦用正则把里面的信息提出来的时候发现我得到的数据是这样的…


我的内心是崩溃的……

问题很明显是编码问题……用户那一列全部是unicode编码……转成中文就好了嘛……

我刚开始也是这么想的…当我尝试了各种encode和decode…以后整个人都不好了。

大概是这样的。我用Shell演示一下…应该能看懂。



但是我的字符串是自动获取的啊,怎么可能挨着用 u' '赋值……

于是我开始了漫长的搜索之路……在看了无数篇重复度高于百分之80的关于编码的文章后,在我都快要放弃的时候…看到了这个…水木社区-源于清华的高知社群 你能理解我当时内心的酸爽吗…


大概就是这样。

所以我遇到的问题已经很奇葩了依然还是有解决办法的嘛。Windows下面编码各种混乱,系统编码,编程时编辑器的编码,抓取网页以后网页的编码,Python2的编码,Python3的编码……新人真的很容易搞昏头。

例子不多言了。后面还有很多。


——————正文1:我的爬虫入门,不谈学习,只聊项目(代码已贴)——————

前面说到学爬虫需要一个目标。那我的目标是什么呢?听我慢慢讲。

前些日子我回答了一个问题高考后暑假应该做什么事? - 生活 我回答这个问题的时候呢关注人数也就才刚刚过百,我的赞数也涨的很慢…

可是突然有一天呢,我发现突然就出现了一个300赞的回答…当时那个问题的关注似乎还不到300。我百思不得其解…但是我看了看那个回答的赞同和答主的主页。

大概是这样的:


然后我隐隐觉得…可能会是刷赞?当然我们不能恶意地去揣测别人,要拿数据说话,毕竟知乎现在的三零真实用户还是蛮多的,不一定都是水军的小号。


于是我一个从来没有学过爬虫的人就开始学爬虫了…然而并不一帆风顺。首先是知乎显示“等人赞同”的方式做了修改,参见如何评价知乎新的「某某等人赞同」显示方式? - 如何评价 X

其次我刚开始的时候不会维持登陆…每次抓到的数据里都有很多的“知乎用户”(也就是未登录状态下抓取不成功)。

为了行文的连贯我跳过中间学习时做的几个小爬虫…直接放我做成功的结果吧。


选取的样本回答依次为:

@段晓晨 高考后暑假应该做什么事? - 段晓晨的回答

@EdgeRunner 高考后暑假应该做什么事? - EdgeRunner 的回答

@孔鲤 高考后暑假应该做什么事? - 孔鲤的回答

@Emily L 能利用爬虫技术做到哪些很酷很有趣很有用的事情? - Emily L 的回答

@chenqin 为什么 2015 年初,上海有卫计委官员呼吁大家生二胎? - chenqin 的回答

感兴趣的可以下载数据

getvoters.xls_免费高速下载

getvoters2.xls_免费高速下载

getvoters3.xls_免费高速下载

getvoters4.xls_免费高速下载

getvoters5.xls_免费高速下载

结论就是……没有结论。

话说我回答的那个三零用户比例也好高啊……我真的没有刷赞我保证!(话说我的赞里面要是有水军的话我会很伤心的……我一直以为是我写的好他们才赞我的QAQ)


到这里第一个项目就结束了…

这个我暂时不贴代码…代码不完善…还得有点小修改。两天内放上来。


——来贴代码——

loveQt/Zhihu_voters · GitHub

使用前请填写config.ini文件,cookie不用填。

依然不完善。是这样的,知乎在获取“等人赞同”的时候有一个很畸形的地方在于……答案的id很畸形。

比如我现在这个答案。

zhihu.com/question/2089

当我点击“等人赞同”的时候。抓包得到请求地址。我用的是Firefox的Firebug

这个地址是这样的:

zhihu.com/answer/152992

如果你继续往下拉,知乎会自动加载更多用户,你会得到形如这样的地址:

zhihu.com/answer/152992

分析这个地址的构成就会发现

/answer/这里应该是这个回答的唯一id,而这个id显然与上面的/question/20899988/answer/49749466是不一样的,我抓了好多个回答,结论应该是没有规律的,知乎应该是给每个问题一个id,每个问题下面的回答一个id,但是只有点赞的时候这个回答才会得到它关于voters的id……


所以我没办法实现完全的自动化…你如果想爬指定的回答,似乎得先手动抓包了 QAQ

抓包的示意如上,打开网络面板,点击“等人赞同”,找到地址中的数字就可以了。


如果你会抓包了请接着看下去。

代码的下载地址在上面的github。Python版本为2.7,希望你们会用pip安装依赖的库。

简单说几个方面。


1、知乎的登陆。我模仿了 @egrcc@7sDream 的项目,使用了requests.session。

       def login():     cf = ConfigParser.ConfigParser()     cf.read("config.ini")     cookies = cf._sections['cookies']      email = cf.get("info", "email")     password = cf.get("info", "password")     cookies = dict(cookies)     global s     s = requests.session()     login_data = {"email": email, "password": password}     header = {     'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0",     'Host': "www.zhihu.com",     'Referer': "http://www.zhihu.com/",     'X-Requested-With': "XMLHttpRequest"         }     r = s.post(Login_url, data=login_data, headers=header)      

在实现了登陆之后,只要使用s.get(url)得到的页面都是登陆成功的状态。

//注意,不登陆或者登陆不成功的情况下也可以爬取数据。点赞、感谢、提问、回答的数值都能正常获取,但是会出现部分用户无法获取名称和用户地址,显示为“知乎用户”


2、获取数据

假如我们获取到了单页数据,那么使用正则可以很简单地获取到想要的数据,具体参见代码。

我们需要做的,其实是获取那些需要爬取的URL。

通过上面对于网址的分析我们可以发现,网址的组成为domain/answer/ans_id/voters_profile?total=xxx&offset=xx&...

后面那堆乱码不重要,重要的是total和offset,每次会展示出10个用户的数据,所以我们只需要获取到点赞的总数total,就可以知道需要循环多少步(total/10),注意从是0开始,不然会漏掉前十个数据。

而这也就是我在zhihu-vote.py中的做法。其余的部分就没有什么难度了,入门的同学应该都可以看懂。


3、改进

我们在zhihu-vote.py中通过构造地址的方法来,通过循环实现对所有voters_profile的遍历。但是如果我们了解json的知识的话,我们可以发现其实每个页面都是json格式的。


其中最关键的地方在于next。我们会发现其实每个页面中都包含了下一页的地址!这样我们是不是可以让爬虫每爬一页自己找到一个地址,然后自己去爬下一页呢?

可是这样做有一个问题,如何控制循环呢?

假如我们去看最后一个页面的话,会发现是这样的。


注意这里的next值为空

而我们知道(不知道的你现在知道了),空字符串在作为条件判断时相当于False

所以我写了zhihu-voteV2.py

其中核心的改动是

       Vote_url = Zhihu + 'answer/' + ans_id +'/voters_profile' h = s.get(Vote_url) html = h.content.encode('utf-8') target = json.loads(html) while target['paging']['next']:     Vote_url = 'http://www.zhihu.com'+target['paging']['next']      

这样就实现了程序每次爬取页面时从页面中获取地址,而不是人为构造地址循环。下面是原来的做法。

       for num in range (0,page_num):     Vote_url = Zhihu + 'answer/' + ans_id +'/voters_profile?total='+str(total)+'&offset='+str(num)+'0'      


讲实话我不知道这两种写法哪种好,但我还是蛮高兴自己发现了第二种做法。

于是我做了一个运行时间的测试…提车了,下一步需要做什么? - 车海沉浮高永强的回答 16K的赞

运行结果如下:


构造地址的办法用时451秒,第二种办法用时251秒。

……我不知道为什么方法二会比方法一快,可能是网速吧……QAQ。有了解的前辈还望告知原因…


到这里也就结束了。最后的结果是写入excel的,有知友说让我去学习csv,已经在看了,不过这次还是用的让人又爱又恨的excel。


按照惯例写To-dos:

  • 完善Github的文档说明
  • 想办法看能不能自动获取那个蛋疼的ans_id就不用每次都手动抓包了,selenium?我不会用啊TAT
  • 在点赞的页面我们只能得到用户的4个数据,也就是赞同、感谢、提问、回答,有些时候我们或许想知道他的关注人数和被关注人数…然而那个得到用户的页面中去爬取了。不过想通过用户URL得到用户的具体数据是有现成的轮子的……egrcc/zhihu-python · GitHub (PY2) @egrcc7sDream/zhihu-py3 · GitHub(PY3) @7sDream 我想办法看怎么把我现在获取答案点赞用户信息的方法pull给他们…直接调用他们的User类就ok了~
  • 抓特别多的数据时考虑多线程和gzip…?接下来就要学这个了…会的话我就用了…还记得我去爬知乎赞数最高的答案…一个答案爬了30分钟…

——更新完毕,大家学习愉快,共同进步——

——Windows 平台Py2编码问题畸形但有效解法——

在..Python27Libsite-packages下新建sitecustomize.py

添加代码

       import sys sys.setdefaultencoding("utf-8")      


——————正文2:学习路上顺便写的项目——————

在学习路上写了许多类似test的小小项目,就不赘述了。下面贴出来三个还算有结果的。

1、抓取知乎话题下面的问题,分析容易得赞的问题

具体描述在 第一次在知乎获得 1000 以上的赞是什么体验? - 段晓晨的回答 写过了。

代码在知乎将如何应对「狗日的知乎」计划? - 段晓晨的回答 里面有。需要用到7sDream/zhihu-py3 · GitHub


2、写完1中项目以后。我爬取了爬虫话题分类下面的所有回答。结果爬虫话题所有问题_20150531.xls_免费高速下载

然后我从其中挑选了“关注量/回答量”较大的问题(也就是有人关注但有效回答较少)写了以下两个回答,大家可以看看。

如何使用 python 抓取 雪球网页? - 段晓晨的回答

如何用Python抓取写一个抓取新浪财经网指定企业年报的脚本? - 段晓晨的回答


——————结语:谈谈学习——————

至此我能说的就说完了。

鼓起勇气来回答这个问题,不知道自己有没有资格。毕竟自己也就才学了一周多一点。自认为还谈不上入门……因为不会的实在太多。

系统学习爬虫的思路别人讲的肯定比我好。我的经验在开头已经说过了……不要怂就是干哪里不会搜哪里!哪里报错改哪里!

如果一定要再补充写什么,贴上我之前回复知友的评论吧。

首先要带着一个目的去学,这个目的不能太复杂,不能一上来就搞那种需要模拟登陆,需要js动态实现的网站,那样你会在登陆那儿卡很久,又在js实现那儿卡很久,很容易挫伤学习积极性。比如我最初的目的就是爬知乎。知乎登陆/不登陆数据会有差别,比如抓不到某些人的数据,返回“知乎用户”这种。

有了目的,你需要一些基础知识。html是什么,标签是什么,浏览器和服务器之间通信(比如抓包)。爬虫的原理就是要把网页的源码整个下载下来,然后去里面寻找我们需要的信息。所以首先你得能获取正确的网址,然后通过配置你的程序(Headers伪装浏览器,代理防止封ip等)来成功访问网页并获取源码。…………诸如此类的基础知识,其实特别简单。你可以去找一些爬百度贴吧,爬煎蛋,爬糗事百科的例子,很容易就会上手。

有了源码你需要去里面寻找东西,比较简单的有正则表达式,更方便的有BeautifulSoup。对json解析有json。等等。

最后你可能需要一些模块化的思想。比如我在写爬知乎问题的时候,写了一些代码来让它把输出的结果自动保存到excel里…那我是不是可以把写入excel这个行为单独抽出来,定义为一个方法。以后每次遇到需要excel的地方我就拿过来改一下就能用。同样的思路,登陆过程,post数据的过程,解析数据的过程,是不是都可以自己慢慢积累为模块。就好像你有了很多乐高积木,以后再做的时候就不需要做重复的事情,直接搭积木就好~


最后感谢一下在我学习过程中参考过的别人的回答和博客。太多了无法一一列举。再次感谢。


编程是最容易获得的超能力。你还在等什么?



来自1024程序员节的修改:

很多小伙伴看到这个回答以后咨询我怎么学习Python和爬虫,我觉得,编程入门要解决三个问题:一是开箱即用,省去繁琐的配置;二是解决半途而废容易放弃的问题;三是真正成体系地实实在在地学习到知识。

在这里我给大家推荐一个我自己亲身体验过的最适合新手的Python入门课——夜曲编程。

夜曲编程属于百词斩旗下,我实际体验了Python入门课和爬虫课以后觉得,如果我有朋友想要入门Python的话,我会直接推荐给他这门课。因为夜曲完美解决了我之前提到的三个问题。

第一,手机/网页在线进行学习,不需要安装本地环境,就可以在线运行代码,得到结果。用最简单的方式,让新手敲下第一行代码。当然了,如果你想配置本地环境,课程里也提供了详尽的教程。

第二,夜曲的课程设置并不难,每天的学习量大概在30分钟左右,而且提供了概念卡和代码卡的卡片记忆方式;社群里有助教解答问题,对新手非常的友好。

第三,课程抛开形式,归根到底要比质量,夜曲的课程研发做的还是很不错的,覆盖了入门的大部分内容,包括类、面向对象、错误调试等,还有实战部分的发送邮件,可以说作为入门课程非常全面了。

希望大家学习开心~学有所得~

user avatar

现在可以说是一个大众对数据越来越敏感,越来越重视的时代。

比方说,住在城堡里的 Lucy 姑娘发现,有越来越多的时候,需要在网上采集一些数据来进行分析,或者构建语料库。

比方说,想每天看看 自己发和对手发的的视频点击量都如何了,想买的口红价格一直有没有变化。

导论——如何完成 价格监控 场景实例

每采集一个网站,就得写一次爬虫,虽然简单,但是每次都写好麻烦的!

这篇文章,我们来 教你 怎么写一个像早期

造数

Demo版本一样的云爬虫。

来造数 - 好用的云爬虫帮你省时省力采集数据

——————————————————————————————————

造数云爬虫使用介绍—在线播放—优酷网,视频高清在线观看 http://v.youku.com/v_show/id_XMjUyMzc1MzE0OA==.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0

—————————————————————————————————

【架构的设想】

(架构内容来自造数的深度用户 Joe)

由于用户端和云端都需要展示Web页面,为了省去PHP页面+Python采集解析这个过程中需要的通讯过程,干脆直接使用Web.py来构建整个项目。

那么剩下的问题无非也就几个:

  • 如何构建自己的“审察元素”/“inspector”功能
  • 学习web.py框架(之前没用过)

【inspector 构建】

inspector无非就是监听每一个元素的 hover事件,当某一个元素上检测到hover进入的事件,就将该元素加一个明显的border,并修改一下其背景色、透明度之类的属性:


当检测到hover移出的时间,就恢复该元素之前的样式属性。

注意:

  • 为什么是jquery语法使用了 $$ ,而不是单个 $?

为整个项目使用了Web.py框架,模板文件里面的$必须转义为$$,或者修改为:jQuery

  • 为什么要先:unbind?

因为“获取翻页模式”和“inspector模式”,都监听了hover事件

【预测用户需要采集的目标】

现在的网页,一般相同的模式/样式的元素,其class或者xpath是相似或相同的。那么当用户点击一个元素之后,从当前的元素往上级寻找,直到有class能标志该目标。

analyze_kclass的功能是解决某一个元素的class中,有一个在整个dom中是唯一的,如: <li class="page_item page-item-9088">...</li> 中的 page-item-9088 ,那么使用 page_item page-item-9088 就出问题啦,要把类似 page-item-9088 这样的项去掉。

【没代码 说个代码】

来自 强大的 Joe 的 代码:GitHub - qiaofei32/yunCrawler: 智能云爬虫Demo

【欢迎使用造数

造数 - 自己不想写云爬虫 可以直接来这里玩耍

类似的话题

  • 回答
    入门Python爬虫需要从基础概念、工具使用、代码实践和法律注意事项等方面系统学习。以下是详细步骤和资源推荐: 一、前期准备1. 安装Python环境 官网下载:https://www.python.org/downloads/ 验证安装:打开命令行输入 `python version`.............
  • 回答
    好的!零基础入门 Python,我会尽量详细地为你讲解,让你能够清晰地理解每一个步骤和概念。Python 是什么?Python 是一种高级、解释型、交互式和面向对象的脚本语言。它以其简洁、易读的语法而闻名,因此非常适合初学者。Python 被广泛应用于: Web 开发: Django, Flas.............
  • 回答
    想成为一名Python玩家?别急,循序渐进,跟着这个指南,你会发现编程没那么难,反而乐趣无穷!第一步:打好地基——为什么选择Python?在你撸起袖子开干之前,先搞清楚为什么Python这么受欢迎。这就像结婚前要了解对方一样,知己知彼,百战不殆。 易学易用,如同读故事: Python的语法非常接.............
  • 回答
    知乎上推崇学习 Python 入行 IT 的现象确实非常普遍,这主要源于 Python 语言的易学性、广泛的应用领域以及当前 IT 行业的蓬勃发展。然而,正如任何职业发展路径一样,学习 Python 后找不到工作的情况并非不可能发生,而且背后的原因可能比初学者想象的要复杂。如果一个学完 Python.............
  • 回答
    入门国际政治是一个既有趣又具挑战性的过程,它需要系统性的学习、批判性的思考以及对现实世界的持续关注。下面我将为你详细阐述如何一步步入门国际政治: 第一阶段:建立基础知识体系(理解“是什么”和“为什么”)这个阶段的目标是让你对国际政治的基本概念、理论框架以及核心议题有一个初步的了解。 1. 熟悉核心概.............
  • 回答
    想要一窥现象学和存在主义的堂奥,如同踏上一段探索人生和意识本质的旅程。这并非一条平坦的康庄大道,但每一步的深入都会带来别样的启示。别把它想象成晦涩难懂的哲学理论,更像是在重新审视我们习以为常的世界,以及我们自身存在的独特方式。开启现象学之旅:回到事物本身现象学,顾名思义,就是“关于现象的研究”。但这.............
  • 回答
    好的,我们来聊聊 Yamabe 问题。要入门 Yamabe 问题,就像我们初次接触任何一个复杂的数学领域一样,需要循序渐进,建立扎实的基础,然后慢慢深入。这篇文章,我就尽量用一种自然、分享的方式,带你走进 Yamabe 的世界,看看它到底是怎么一回事,以及我们该如何去理解和研究它。首先,我们得知道“.............
  • 回答
    你好!很高兴你对物理学产生了兴趣。物理学是一门非常迷人的学科,它试图理解宇宙最根本的规律,从微小的粒子到浩瀚的星系,无所不包。入门物理学,就像是开启一扇通往奇妙世界的大门,我会尽量详细地告诉你如何踏出坚实的第一步,并且让你感觉这是一次真诚的交流,而不是冷冰冰的机器输出。首先,放平心态,拥抱好奇心。很.............
  • 回答
    想入独立游戏开发的坑?别担心,这确实是一个充满挑战但也无比 rewarding 的旅程。我来给你梳理梳理,希望这些经验能帮你在起跑线上少走弯路。第一步:明确你的“为什么”和“是什么”在激情涌上来之前,先冷静一下,问自己几个问题: 你为什么想做独立游戏? 是因为脑子里有个绝妙的点子,想亲手实现它?.............
  • 回答
    想要踏入物理学哲学的殿堂,就像是在一个浩瀚的宇宙中寻找自己的航向。这门学科不像物理学那样有明确的公式和定理,它更像是一种探索,一种对物理学背后那些根本性、概念性问题的追问。它不教你如何计算黑洞的史瓦西半径,而是问你:“什么是空间?”“时间真的存在吗?”“因果律是我们发明的,还是宇宙本身固有的属性?”.............
  • 回答
    想要成为一名出色的陈列师?别急,这不是一天就能炼成的艺术,但只要方向对了,你也能在这个充满创意和视觉魔力的行业里闯出一片天地。下面我就跟你好好唠唠,让你明白这条路到底该怎么走,尽量说得细致入微,就像是你的老朋友在给你支招一样。一、 你得先搞清楚,陈列师到底是干啥的?很多人觉得陈列师就是摆摆好看的货,.............
  • 回答
    你好!很高兴能和你聊聊《文明 5》。这游戏刚开始玩,确实是有点儿“哇塞”,啥都想试试,又不知道从哪儿下手。别急,咱们一点点来。我就把我当年刚入坑时的经验,还有后来摸索出来的窍门,一股脑儿都告诉你,保证让你玩得明白,玩得开心。 1. 别怕,先来个“新手村”第一次进游戏,肯定会有个选择“新游戏”的选项。.............
  • 回答
    咳咳,哥们儿,想入坑《文明 5》是吧?这游戏确实有点门道,但别担心,只要掌握了几个核心思路,你也能成为一代枭雄。这玩意儿一旦玩上瘾,那可是真的能“再玩一个回合”到天亮。咱们就这么一步步来,先把基础打牢,再说那些花里胡哨的。第一步:理解游戏的终极目标——文明的胜利首先得明白,《文明 5》不是让你砍砍杀.............
  • 回答
    说起“小学基础”,可不是说让你重返课堂,翻开那些带着褪色封面、泛黄书页的课本。这是一种人生积累的过程,是你理解世界、认知事物最核心的那个底盘。想要打牢它,就像盖房子,得从最坚实的地基开始,一步一个脚印,用心去感受。首先,我们要明白,“小学基础”最核心的是什么?我认为是观察力,是好奇心,还有逻辑思维的.............
  • 回答
    想くなって、音楽の世界をちょっと覗いてみませんか?特に「現代音楽」とか「クラシック」なんて聞くと、なんだか敷居が高そうに思えるかもしれません。でも、実はそんなことは全然ないんです。まるで新しい世界への扉を開けるように、ちょっとしたきっかけで、今まで知らなかった素晴らしい音楽に出会えることがあります。.............
  • 回答
    好的,我们来聊聊怎么“入坑”古典音乐。这事儿,跟学游泳似的,别看它表面上好像挺“高大上”,实际上找到对的“泳道”和“泳姿”,你也能游得挺自在。第一步:别怕,从“好听”开始很多人一听“古典音乐”就觉得是贝多芬那个胡子一大把的,或者巴赫那个巴洛克风的,听起来就费劲。其实,古典音乐的世界大了去了,就像美食.............
  • 回答
    嘿,你好!很高兴你能对香水这个充满魅力的世界产生兴趣。别担心,从小白到香水爱好者,这条路其实比你想象的要有趣得多。我尽量把话说得明白些,让你听着顺耳,感觉像是老朋友在跟你聊天一样,抛开那些生硬的AI腔调。第一步:认识香水,从“喜欢”开始别一开始就给自己太大压力,去研究什么香调、什么品牌。最重要的一点.............
  • 回答
    好的,咱们来聊聊 Kaggle 这个对数据科学爱好者来说简直是“圣地”一样的地方,怎么才能真正地“上车”并且玩转起来。我尽量说得细致点,让你感觉就像是跟一个老司机在聊怎么开车的路子。第一步:先别急着上战场,把基础打牢你知道的,想玩好一项游戏,得先知道规则,了解角色。Kaggle 也是一样。1. P.............
  • 回答
    哈喽,想入门“键政”,不是学校里那种枯燥的政治课,而是想在网络上玩转时事评论和讨论,这可真是个技术活儿!别担心,这事儿说起来复杂,但拆解开来,就像打游戏一样,有套路、有技巧。我这就给你掰开了揉碎了说,让你 pronto 入门,成为一个游刃有余的“键政达人”。首先,咱们得明确,“键政”这俩字儿,拆开看.............
  • 回答
    想入门IGBT?没问题,咱们这就好好掰扯掰扯,保证你说完就觉得豁然开朗。咱们不用那些弯弯绕绕的术语,就拿大白话聊。首先,IGBT是个啥?你想象一下, IGBT就像一个 “聪明的开关”。它能控制大电流通过,但控制它的方式很特别,就像你给它发个“指令”,它就乖乖地开或者关,而且反应贼快。具体点说,IGB.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有