python 爬虫

python实现简单爬虫功能

通过python 来实现一个简单的爬虫功能,把我们想要的代码爬取到本地。

一,获取整个页面数据

首先获取要下载图片的整个页面信息。getjpg.py

#coding=utf-8
import urllib

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

html = getHtml("http://tieba.baidu.com/p/2738151262")

print html

Urllib 模块提供了读取web页面数据的接口,可以像读取本地文件一样读取www和ftp上的数据。定义了一个getHtml()函数:

  • urllib.urlopen()方法用于打开一个URL地址。
  • read()方法用于读取URL上的数据,向getHtml()函数传递一个网址,并把整个页面下载下来。执行程序就会把整个网页打印输出。
二,筛选页面中想要的数据

Python 提供了非常强大的正则表达式:http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html

假如我们百度贴吧找到了几张漂亮的壁纸,通过到前段查看工具。找到了图片的地址,如:src=”http://imgsrc.baidu.com/forum......jpg”pic_ext=”jpeg”,修改代码如下:

import re
import urllib

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = r'src="(.+?\.jpg)" pic_ext'
    imgre = re.compile(reg)
    imglist = re.findall(imgre,html)
    return imglist      
   
html = getHtml("http://tieba.baidu.com/p/2460150866")
print getImg(html)

创建了getImg()函数,用于在获取的整个页面中筛选需要的图片连接。re模块主要包含了正则表达式:

  • re.compile() 可以把正则表达式编译成一个正则表达式对象.
  • re.findall() 方法读取html 中包含 imgre(正则表达式)的数据。
  • 运行脚本将得到整个页面中包含图片的URL地址。
三,将页面筛选的数据保存到本地

把筛选的图片地址通过for循环遍历并保存到本地,代码如下:

#coding=utf-8
import urllib
import re

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

def getImg(html):
    reg = r'src="(.+?\.jpg)" pic_ext'
    imgre = re.compile(reg)
    imglist = re.findall(imgre,html)
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl,'%s.jpg' % x)
        x+=1

html = getHtml("http://tieba.baidu.com/p/2460150866")

print getImg(html)

这里的核心是用到了urllib.urlretrieve()方法,直接将远程数据下载到本地。程序运行完成,将在目录下看到下载到本地的文件。



Python 3开发网络爬虫

选择参考资料

一个简单的伪代码

用到了set和queue这两种经典的数据结构, 集与队列. 集的作用是记录那些已经访问过的页面, 队列的作用是进行广度优先搜索.

queue Q
set S
StartPoint = "http://jecvay.com"
Q.push(StartPoint) # 经典的BFS开头 
S.insert(StartPoint) # 访问一个页面之前先标记他为已访问
while (Q.empty() == false ) # BFS循环体
    T = Q.top() # 并且pop
    for point in PageUrl(T) # PageUrl(T)是指页面T中所有url的集合, point是这个集合中的一个元素.
        if (point not in S)
            Q.push(point)
            S.insert(point)

这里用到的Set其内部原理是采用了Hash表, 传统的Hash对爬虫来说占用空间太大, 因此 有一种叫做 Bloom Filter 的数据结构 更适合用在这里替代Hash版本的set. 这就是个最简单的BFS结构. 我是看了知乎里面的那个伪代码之后, 自己用我的风格写了一遍. 

代码实现(一): 用Python抓取指定页面

代码如下:

#encoding:UTF-
import urllib.request
url = "http://www.baidu.com"
data = urllib.request.urlopen(url).read()
data = data.decode( 'UTF-8' )
print(data)

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)

这个函数返回一个 http.client.HTTPResponse 对象, 这个对象又有各种方法, 比如geturl、info、getcode 这些方法都可以 根据官方文档的链接链过去 . 

代码实现(二): 用Python简单处理URL

抓取百度上面搜索关键词为Jecvay Notes的网页, 代码如下:

import urllib
import urllib.request
data={}
data['word']= 'Jecvay Notes'
url_values=urllib.parse.urlencode(data)
url= "http://www.baidu.com/s?"
full_url=url + url_value
sdata=urllib.request.urlopen(full_url).read()
data=data.decode( 'UTF-8' )
print(data)

我们已经学会:

  1. 用伪代码写出爬虫的主要框架;
  2. 用Python的urllib.request库抓取指定url的页面;
  3. 用Python的urllib.parse库对普通字符串转符合url的字符串.

开始用Python将伪代码中的所有部分实现. 

Python的队列

在爬虫程序中, 用到了广度优先搜索(BFS)算法. 这个算法用到的数据结构就是队列.

Python的List功能已经足够完成队列的功能, 可以用 append() 来向队尾添加元素, 可以用类似数组的方式来获取队首元素, 可以用 pop(0) 来弹出队首元素. 但是List用来完成队列功能其实是 低效率 的, 因为List在队首使用 pop(0) 和 insert() 都是效率比较低的, Python官方建议使用 collection.deque 来高效的完成队列任务.

from collections import deque
queue = deque([ "Eric" , "John" , "Michael" ])
queue.append( "Terry" ) # Terry 入队
queue.append( "Graham" ) # Graham 入队
queue.popleft() # 队首元素出队
#输出: 'Eric'
queue.popleft() # 队首元素出队
#输出: 'John'
queue # 队列中剩下的元素
#输出: deque([ 'Michael' , 'Terry' , 'Graham' ])

Python的集合

为了不重复爬那些已经爬过的网站, 需要把爬过的页面的url放进集合中, 在每一次要爬某一个url之前, 先看看集合里面是否已经存在. 如果已经存在, 就跳过这个url; 如果不存在, 把url放入集合中, 然后再去爬这个页面.

Python提供了set这种数据结构. set是一种无序的, 不包含重复元素的结构. 一般用来测试是否已经包含了某元素, 或者用来对众多元素们去重. 与数学中的集合论同样, 他支持的运算有 交, 并, 差, 对称差 .创建一个set可以用 set() 函数或者花括号 {} . 但是创建一个空集是不能使用一个花括号的, 只能用 set() 函数. 因为一个空的花括号创建的是一个 字典 数据结构. 以下同样是Python官网提供的示例.

>>> basket = { 'apple' , 'orange' , 'apple' , 'pear' ,'orange' , 'banana' }
>>> print(basket) # 这里演示的是去重功能
{ 'orange' , 'banana' , 'pear' , 'apple' }
>>> 'orange' in basket # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False 
>>> # 下面展示两个集合间的运算. ...
>>> a = set ( 'abracadabra' )
>>> b = set ( 'alacazam' )
>>> a
{ 'a' , 'r' , 'b' , 'c' , 'd' }
>>> a - b # 集合a中包含元素
{ 'r' , 'd' , 'b' }
>>> a | b # 集合a或b中包含的所有元素
{ 'a' , 'c' , 'r' , 'd' , 'b' , 'm' , 'z' , 'l' }
>>> a & b # 集合a和b中都包含了的元素
{ 'a' , 'c' }
>>> a ^ b # 不同时包含于a和b的元素
{ 'r' , 'd' , 'b' , 'm' , 'z' , 'l' }

其实我们只是用到其中的 快速判断元素是否在集合内 的功能, 以及集合的 并运算 .

Python的正则表达式

在爬虫程序中, 爬回来的数据是一个字符串, 字符串的内容是页面的html代码. 我们要从字符串中, 提取出页面提到过的所有url. 这就要求爬虫程序要有简单的字符串处理能力, 而正则表达式可以很轻松的完成这一任务.

参考资料

Python网络爬虫Ver 1.0 alpha

入口地址是Startup News , 这个爬虫虽然可以勉强运行起来, 但是由于缺乏 异常处理 , 只能爬些静态页面, 也不会分辨什么是静态什么是动态, 碰到什么情况应该跳过, 所以工作一会儿就要败下阵来.

import re
import urllib.request
import urllib
from collections import deque

queue = deque()
visited = set ()
url = 'http://news.dbanotes.net'
queue.append(url)
cnt = 0
while queue:
    url = queue.popleft() # 队首元素出队
    visited |= {url} # 标记为已访问
    print( '已经抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url)
    cnt += 1
    urlop = urllib.request.urlopen(url)
    if 'html' not in urlop.getheader( 'Content-Type' ):
        continue
    # 避免程序异常中止, 用try .. catch处理异常
    try :
        data = urlop.read().decode( 'utf-8' )
    except:
        continue
    # 正则表达式提取页面中所有队列, 并判断是否已经访问过, 然后加入待爬队列
    linkre = re.compile( 'href=\"(.+?)\"' )
    for x in linkre.findall(data):
        if 'http' in x and x not in visited:
        queue.append(x)
        print( '加入队列 ---> ' + x)

这个版本的爬虫使用的正则表达式是:

'href=\"(.+?)\"'

所以会把那些.ico或者.jpg的链接都爬下来. 这样read()了之后碰上decode(‘utf-8′)就要抛出异常. 因此我们用 getheader() 函数来获取抓取到的文件类型, 是html再继续分析其中的链接.

if 'html' not in urlop.getheader( 'Content-Type' ):
    continue

即使是这样, 依然有些网站运行decode()会异常. 因此我们把decode()函数用try..catch语句包围住, 这样他就不会导致程序中止. 程序运行效果图如下:

a70136d7d0a8cac98b48b65566f8178b

上面简单写了一个勉强能运行的爬虫alpha.有很多问题. 比如一个网站上不了, 爬虫却一直在等待连接返回response, 不知道超时跳过; 或者有的网站专门拦截爬虫程序, 我们的爬虫也不会伪装自己成为浏览器正规部队; 并且抓取的内容没有保存到本地, 没有什么作用. 这次我们一个个解决这些小问题.

添加超时跳过功能

首先, 我简单地将

urlop = urllib.request.urlopen(url)

改为

urlop = urllib.request.urlopen(url, timeout = )


运行后发现, 当发生超时, 程序因为exception中断. 于是我把这一句也放在try .. except 结构里, 问题解决.

支持自动跳转

在爬 http://baidu.com 的时候, 爬回来一个没有什么内容的东西, 这个东西告诉我们应该跳转到 http://www.baidu.com . 但是爬虫并不支持自动跳转, 现在我们来加上这个功能, 让爬虫在爬 baidu.com 的时候能够抓取 www.baidu.com 的内容.

首先要知道爬 http://baidu.com 的时候他返回的页面是怎么样的,  这里我抓到的内容如下:

<html>
<meta http-equiv=”refresh” content=” ;url=http: //www.baidu.com/”>
</html>

看代码我们知道这是一个利用 html 的 meta 来刷新与重定向的代码, 其中的0是等待0秒后跳转, 也就是立即跳转. 我们再像上一次说的那样用一个正则表达式把这个url提取出来就可以爬到正确的地方去了. 其实我们上一次写的爬虫已经可以具有这个功能, 这里只是单独拿出来说明一下 http 的 meta 跳转.

伪装浏览器正规军

如何让网站们把Python爬虫当成正规的浏览器来访. 因为如果不这么伪装自己, 有的网站就爬不回来了. 如果看过理论方面的知识, 就知道我们是要在 GET 的时候将 User-Agent 添加到header里.

如果没有看过理论知识, 按照以下关键字搜索学习吧 

  • HTTP 报文分两种:  请求报文 和 响应报文
  • 请求报文的 请求行 与 首部行
  • GET ,  POST , HEAD, PUT, DELETE 方法

我用 IE 浏览器访问百度首页的时候, 浏览器发出去的请求报文如下:

GET http: //www.baidu.com/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US,en;q= 0.8 ,zh-Hans-CN;q= 0.5 ,zh-Hans;q= 0.3
User-Agent: Mozilla/ 5.0 (Windows NT 6.3 ; WOW64; Trident/ 7.0 ; rv: 11.0 ) like Gecko
Accept-Encoding: gzip, deflate Host: www.baidu.com
DNT:
Connection: Keep-Alive
Cookie: BAIDUID=57F4D171573A6B88A68789EF5DDFE87:FG= ; uc_login_unique=ccba6e8d978872d57c7654130e714abd; BD_UPN= ; BD

然后百度收到这个消息后, 返回给我的的响应报文如下(有删节):

HTTP/ 1.1 OK
Date : Mon, Sep : : GMT
Content-Type: text/html; charset=utf-
Connection: Keep-Alive Vary: Accept-Encoding
Cache-Control: private
Cxy_all: baidu+8b13ba5a7289a37fb380e0324ad688e7
Expires: Mon, Sep : : GMT
X-Powered-By: HPHP
Server: BWS/ 1.1
BDPAGETYPE:
BDQID: 0x8d15bb610001fe79
BDUSERID:
Set-Cookie: BDSVRTM= ; path=/
Set-Cookie: BD_HOME= ; path=/
Content-Length:
<!DOCTYPE html><!–STATUS OK–><html><head>
<meta http-equiv=”content-type” content=”text/html;charset=utf- ″>
<meta http-equiv=”X-UA-Compatible” content=”IE=Edge”>
<link rel=”dns-prefetch” href=” //s1.bdstatic.com”/>
<link rel=”dns-prefetch” href=”//t1.baidu.com”/>
<link rel=”dns-prefetch” href=”//t2.baidu.com”/>
<link rel=”dns-prefetch” href=”//t3.baidu.com”/>
<link rel=”dns-prefetch” href=”//t10.baidu.com”/>
<link rel=”dns-prefetch” href=”//t11.baidu.com”/>
<link rel=”dns-prefetch” href=”//t12.baidu.com”/>
<link rel=”dns-prefetch” href=”//b1.bdstatic.com”/>
<title>百度一下,你就知道</title>
<style index=”index” > ……….这里省略两万字……………. </script>
</body></html>

要做的就是在 Python 爬虫向百度发起请求的时候, 顺便在请求里面写上 User-Agent, 表明自己是浏览器君.

在 GET 的时候添加 header 有很多方法, 下面介绍两种方法.

第一种 方法比较简便直接, 但是不好扩展功能, 代码如下:

import urllib.request
url = 'http://www.baidu.com/'
req = urllib.request.Request(url, headers = {
'Connection' : 'Keep-Alive' ,
'Accept' : 'text/html, application/xhtml+xml, */*' ,
'Accept-Language' : 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3' ,
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
}) oper = urllib.request.urlopen(req) data = oper.read() print(data.decode())

第二种 方法使用了 build_opener 这个方法, 用来自定义 opener, 这种方法的好处是可以方便的拓展功能, 例如下面的代码就拓展了自动处理 Cookies 的功能。

import urllib.request
import http.cookiejar

cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
header = []
for key, value in head.items():
    elem = (key, value)
    header.append(elem)
opener.addheaders = header
return opener
oper = makeMyOpener()
uop = oper.open( 'http://www.baidu.com/' , timeout = )
data = uop.read() print(data.decode())

保存抓回来的报文

将抓回来的数据 data 以二进制形式保存, 也可以经过 decode() 处理成为字符串后以文本形式保存. 改动一下打开文件的方式就能用不同的姿势保存文件了. 下面是参考代码:

def saveFile(data):
    save_path = 'D:\\temp.out'
    f_obj = open(save_path, 'wb' ) # wb 表示打开方式
    f_obj.write(data)
    f_obj.close()
    # 这里省略爬虫代码 # ... # 爬到的数据放到 dat 变量里 # 将 dat 变量保存到 D 盘下 saveFile(dat)

用 Python 来登录网站, 用Cookies记录登录信息, 然后就可以抓取登录之后才能看到的信息. 今天我们拿知乎网来做示范. 知乎网的登录比较简单, 传输的时候没有对用户名和密码加密, 却又不失代表性, 有一个必须从主页跳转登录的过程.

第一步: 使用 Fiddler 观察浏览器行为

开着 Fiddler 运行浏览器, 输入http://www.zhihu.com 回车后到 Fiddler 中就能看到捕捉到的连接信息. 在左边选中一条 200 连接, 在右边打开 Inspactors 透视图, 上方是该条连接的请求报文信息, 下方是响应报文信息. 其中 Raw 标签是显示报文的原文. 下方的响应报文很有可能是没有经过解压或者解码的, 这种情况他会在中间部位有一个小提示, 点击一下就能解码显示出原文了.

以上这个截图是在未登录的时候进入 http://www.zhihu.com 得到的. 现在我们来输入用户名和密码登陆知乎网, 再看看浏览器和知乎服务器之间发生了什么.

点击登陆后, 回到 Fiddler 里查看新出现的一个 200 链接. 我们浏览器携带者我的帐号密码给知乎服务器发送了一个 POST, 内容如下:

POST http://www.zhihu.com/login HTTP/1.1 
Content-Type: application/x-www-form-urlencoded; 
charset=UTF-8 
Accept: */* 
X-Requested-With: XMLHttpRequest 
Referer: http://www.zhihu.com/#signin 
Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (Windows NT 6.4; WOW64; Trident/7.0; rv:11.0) like Gecko Content-Length: 97 DNT: 1 
Host: www.zhihu.com 
Connection: Keep-Alive 
Pragma: no-cache 
Cookie: __utma=51854390.1539896551.1412320246.1412320246.1412320246.1; __utmb=51854390.6.10.1412320246; __utmc=51854390; __utmz=51854390.1412320246.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmv=51854390.000–|3=entry_date=20141003=1 _xsrf=4b41f6c7a9668187ccd8a610065b9718&email=此处涂黑%40gmail.com&password=此处不可见&rememberme=y

截图如下:

我的浏览器给 http://www.zhihu.com/login 这个网址(多了一个/login) 发送了一个POST, 内容都已经在上面列出来了, 有用户名, 有密码, 有一个”记住我”的 yes, 其中这个 WebForms 标签下 Fiddler 能够比较井井有条的列出来 POST 的内容. 所以我们用 Python 也发送相同的内容就能登录了. 但是这里出现了一个 Name 为 _xsrf 的项, 他的值是 4b41f6c7a9668187ccd8a610065b9718. 我们要先获取这个值, 然后才能给他发.

浏览器是如何获取的呢, 我们刚刚是先访问了 http://www.zhihu.com/ 这个网址, 就是首页, 然后登录的时候他却给 http://www.zhihu.com/login 这个网址发信息. 所以用侦探一般的思维去思考这个问题, 就会发现肯定是首页把 _xsrf 生成发送给我们, 然后我们再把这个 _xsrf 发送给 /login 这个 url. 这样一会儿过后我们就要从第一个 GET 得到的响应报文里面去寻找 _xsrf

截图下方的方框说明, 我们不仅登录成功了, 而且服务器还告诉我们的浏览器如何保存它给出的 Cookies 信息. 所以我们也要用 Python 把这些 Cookies 信息记录下来.

这样 Fiddler 的工作就基本结束了!

第二步: 解压缩

写一个 GET 程序, 把知乎首页 GET 下来, 然后 decode() 一下解码, 结果报错. 仔细一看, 发现知乎网传给我们的是经过 gzip 压缩之后的数据. 这样我们就需要先对数据解压. Python 进行 gzip 解压很方便, 因为内置有库可以用. 代码片段如下:

import gzip
def ungzip(data):
    try : # 尝试解压
        print ( '正在解压.....' )
        data = gzip.decompress(data)
        print ( '解压完毕!' )
    except :
        print ( '未经压缩, 无需解压' )
    return data

通过 opener.read() 读取回来的数据, 经过 ungzip 自动处理后, 再来一遍 decode() 就可以得到解码后的 str 了

第二步: 使用正则表达式获取沙漠之舟

在第一遍 GET 的时候可以从响应报文中的 HTML 代码里面得到这个. 如下函数实现了这个功能, 返回的 str 就是 _xsrf 的值.

import re
def getXSRF(data):
    cer = re. compile ( 'name=\"_xsrf\" value=\"(.*)\"' , flags = )
    strlist = cer.findall(data)
    return strlist[ ]

第三步: 发射 POST !!

集齐 _xsrf, id, password 三大法宝, 我们可以发射 POST 了. 这个 POST 一旦发射过去, 我们就登陆上了服务器, 服务器就会发给我们 Cookies. 本来处理 Cookies 是个麻烦的事情, 不过 Python 的 http.cookiejar 库给了我们很方便的解决方案, 只要在创建 opener 的时候将一个 HTTPCookieProcessor 放进去, Cookies 的事情就不用我们管了. 下面的代码体现了这一点.

import http.cookiejar
import urllib.request

def getOpener(head):
    # deal with the Cookies
    cj = http.cookiejar.CookieJar()
    pro = urllib.request.HTTPCookieProcessor(cj)
    opener = urllib.request.build_opener(pro)
    header = []
    for key, value in head.items():
        elem = (key, value)
        header.append(elem)
        opener.addheaders = header
    return opener

getOpener 函数接收一个 head 参数, 这个参数是一个字典. 函数把字典转换成元组集合, 放进 opener. 这样我们建立的这个 opener 就有两大功能:

自动处理使用 opener 过程中遇到的 Cookies 自动在发出的 GET 或者 POST 请求中加上自定义的 Header

第四部: 正式运行

正式运行还差一点点, 我们要把要 POST 的数据弄成 opener.open() 支持的格式. 所以还要 urllib.parse 库里的 urlencode() 函数. 这个函数可以把 字典 或者 元组集合 类型的数据转换成 & 连接的 str.

str 还不行, 还要通过 encode() 来编码, 才能当作 opener.open() 或者 urlopen() 的 POST 数据参数来使用. 代码如下:

url = 'http://www.zhihu.com/'

opener = getOpener(header)

op = opener. open (url)

data = op.read()

data = ungzip(data) # 解压

_xsrf = getXSRF(data.decode())

url + = 'login'

id = '这里填你的知乎帐号'

password = '这里填你的知乎密码'

postDict = {

'_xsrf' :_xsrf,

'email' : id ,

'password' : password,

'rememberme' : 'y'

}
postData = urllib.parse.urlencode(postDict).encode()

op = opener. open (url, postData)

data = op.read()

data = ungzip(data)

print (data.decode()) # 你可以根据你的喜欢来处理抓取回来的数据了!

代码运行后, 我们发现自己关注的人的动态(显示在登陆后的知乎首页的那些), 都被抓取回来了. 下一步做一个统计分析器, 或者自动推送器, 或者内容分级自动分类器, 都可以.

import gzip

import re

import http.cookiejar

import urllib.request

import urllib.parse

def ungzip(data):

try : # 尝试解压

print ( '正在解压.....' )

data = gzip.decompress(data)

print ( '解压完毕!' )

except :

print ( '未经压缩, 无需解压' )

return data

def getXSRF(data):

cer = re. compile ( 'name=\"_xsrf\" value=\"(.*)\"' , flags = )

strlist = cer.findall(data)

return strlist[ ]

def getOpener(head):

# deal with the Cookies

cj = http.cookiejar.CookieJar()

pro = urllib.request.HTTPCookieProcessor(cj)

opener = urllib.request.build_opener(pro)

header = []

for key, value in head.items():

elem = (key, value)

header.append(elem)

opener.addheaders = header

return opener

header = {

'Connection' : 'Keep-Alive' ,

'Accept' : 'text/html, application/xhtml+xml, */*' ,

'Accept-Language' : 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3' ,

'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' ,

'Accept-Encoding' : 'gzip, deflate' ,

'Host' : 'www.zhihu.com' ,

'DNT' : '1'

}
url = 'http://www.zhihu.com/'

opener = getOpener(header)

op = opener. open (url)

data = op.read()

data = ungzip(data) # 解压

_xsrf = getXSRF(data.decode())

url + = 'login'

id = '这里填你的知乎帐号'

password = '这里填你的知乎密码'

postDict = {

'_xsrf' :_xsrf,

'email' : id ,

'password' : password,

'rememberme' : 'y'

}
postData = urllib.parse.urlencode(postDict).encode()

op = opener. open (url, postData)

data = op.read()

data = ungzip(data)

print (data.decode())

 

转载于:https://my.oschina.net/cqlcql/blog/683931

### Python爬虫的学习资源使用方法 Python爬虫是一种高效的工具,用于自动化的网络信息采集。由于其丰富的库支持以及简洁易懂的语法特性,Python 成为了编写网络爬虫的最佳选择之一[^3]。 #### 学习Python爬虫的基础知识 学习Python爬虫不仅涉及理论知识的理解,还需要通过实际操作来加深印象。在移动设备上也可以轻松完成这些任务,因为手机端的Python环境配置较为简便,可以随时随地进行实践练习[^1]。 #### 推荐的Python爬虫教程列表 以下是几份高质量的Python爬虫教程推荐: - **基础篇** - 《一只小爬虫》[^2] - 《Python简单网络爬虫的编写》[^2] - **进阶篇** - 《[Python]网络爬虫(五):urllib2的使用细节抓站技巧》[^2] - 《[Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)》[^2] - **高级功能** - 《Python爬虫——抓取网页并解析HTML》[^2] - 《Python正则表达式指南》[^2] 除了上述具体的文章外,《Python爬虫新手指南及简单实战》也是一份非常适合初学者的内容,其中包含了详细的案例分析和代码演示[^3]。 #### 实践中的关键技术点 当开始构建自己的第一个爬虫项目时,需要注意以下几个方面: 1. 数据请求模块的选择,比如`requests`或内置的`urllib`。 2. HTML页面解析技术的应用,例如BeautifulSoup或者lxml库。 3. 对于复杂的数据提取需求,则可能需要用到正则表达式的辅助[^2]。 下面展示一段简单的爬虫脚本作为参考: ```python import requests from bs4 import BeautifulSoup url = 'https://example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') titles = soup.find_all('h1') for title in titles: print(title.text.strip()) ``` 此段程序展示了如何访问目标网址,并从中提取所有的标题标签内容[^3]。 #### 工具扩展建议 如果计划进一步深入研究大数据量场景下的爬虫应用,那么像Pandas这样的数据分析框架将会非常有用。它可以方便地管理和转换所收集到的信息至结构化形式以便后续统计分析工作[^4]。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值