您的位置:首页 > 编程语言 > Python开发

极客 | Python | 学习笔记01:Python 定向爬虫入门

2017-07-25 23:58 886 查看
视频课程:牛客网-Python开发入门到实战 https://www.nowcoder.com/courses/10  (讲师:极客学院)

* 极客学院网站中也有对应视频内容 http://www.jikexueyuan.com/course/python/  (可自行按标题搜索)

Ps_1:视频中的PPT以及代码可以在网站中下载

Ps_2:由于网站提供的代码是两年前所写,代码中爬取的网页两年来可能有变动,所以代码运行结果会和视频中不一致,甚至出现报错。

             在本文中的代码均为个人修改后的,无法修改的也进行了标记。



# 三、Python 定向爬虫入门

┏━━━━━目录━━━━━┓

(一)【基本的正则表达式】

3.1 Pycharm 的安装与配置(略)

3.2 正则表达式符号与方法

3.3 正则表达式的应用举例

3.4 实战——制作文本爬虫

(二)【Requests 介绍和安装】

3.5 Requests 介绍和安装

3.6 第一个网页爬虫

3.7 向网页提交数据

3.8 实战——极客学院课程爬虫

(三)【XPath 与多线程爬虫】

3.9 神器 XPath 的介绍与配置

3.10 神器 XPath 的使用

3.11 神器 XPath 的特殊用法

3.12 Python 并行化介绍与演示

3.13 实战——百度贴吧爬虫

┗━━━━━━━━━━━━┛

(一)【基本的正则表达式】

3.2 正则表达式符号与方法

1、常用符号

     .  :  匹配任意字符,换行符\n除外(占位符)

     * :匹配前一个字符0次或无限次

     ? :匹配前一个字符0次或1次

     .*:贪心算法
(贪心算法将会按照尽可能大的原则去匹配字符串。)

——其中标点 . 表示通配符,可以用来匹配除换行符之外的任意符号,* 为重复子模式,允许模式重复0次或者多次;

   .*?:非贪心算法

——其中标点 . 表示通配符,可以用来匹配除换行符之外的任意符号,* 为重复子模式,允许模式重复0次或者多次;? 为可选项。

  \d+:匹配纯数字

import re

s="gaxxIxxefahxxlovexxhoghexxpythonxxghaweoif"
r=re.compile('xx(.*)xx')   # 贪心算法
content=r.findall(s)
print content

r=re.compile('xx(.*?)xx')  # 非贪心算法
content=r.findall(s)
print content
输出

['Ixxefahxxlovexxhoghexxpython']

['I', 'love', 'python']

2、常用函数

(1)findall: 匹配所有符合规律的内容,返回包含结果的列表
*   参数re.S表示多行匹配


s = '''sdfxxhello
xxfsdfxxworldxxasdf'''
print 1, re.findall('xx(.*?)xx', s)  # .不能匹配换行符,在第一行没找到对象,返回了第二行匹配到的
print 2, re.findall('xx(.*?)xx', s, re.S)  # 参数re.S表示多行匹配

s2 = 'asdfxxIxx123xxlovexxdfd,asdfxxhahaxx123xxXIXIxxdfd'
print 3, re.findall('xx(.*?)xx123xx(.*?)xx', s2)  # 找到所有匹配子串
输出
1 ['fsdf']

2 ['hello\n', 'world']

3 [('I', 'love'), ('haha', 'XIXI')]

(2)Search:匹配并提取第一个符合规律的内容,返回一个正则表达式对象(object)
# re.search(pattern, string)
s2 = 'asdfxxIxx123xxlovexxdfd,asdfxxhahaxx123xxXIXIxxdfd'
print 4, re.search('xx(.*?)xx123xx(.*?)xx', s2).group(1)  # 输出一次匹配中的第1个()
print 5, re.search('xx(.*?)xx123xx(.*?)xx', s2).group(2)  # 输出一次匹配中的第2个()

print 6, (re.search('as', s2).span())  # 在起始位置匹配
print 7, (re.search('xx', s2).span())  # 不在起始位置匹配
print 8, (re.search('xx', s2))         # 返回一个正则表达式对象(object)
输出
4 I
5 love
6 (0, 2)
7 (4, 6)
8 <_sre.SRE_Ma
4000
tch object at 0x0000000001CCB510>

(3)Sub:替换符合规律的内容,返回替换后的值

# re.sub(pattern, repl, string)
s3 = 'aaa123rrrrr123aaa'
print 9, re.sub('123(.*?)123', '替换', s3)                  # 连通123一起替换
print 10, re.sub('123(.*?)123', '123%s123' % "替换后", s3)  # 替换123与123之间的内容

p1 = re.compile('123(.*?)123')
print 11, p1.sub('123%s123' % "替换后", s3)                 # 替换123与123之间的内容
输出
9 aaa替换aaa
10 aaa123替换后123aaa
11 aaa123替换后123aaa

3.3 正则表达式的应用举例

1、使用findall与search从大量文本中匹配感兴趣的内容

* 灵活使用findall与search

* 先抓大再抓小

测试用的text.txt
<html>
<head>
<title>极客学院爬虫测试</title>
</head>
<body>
<div class="topic"><a href="http://jikexueyuan.com/welcome.html">欢迎参加《Python定向爬虫入门课程》</a>
<div class="list">
<ul>
<li><a href="http://jikexueyuan.com/1.html">这是第一条</a></li>
<li><a href="http://jikexueyuan.com/2.html">这是第二条</a></li>
<li><a href="http://jikexueyuan.com/3.html">这是第三条</a></li>
</ul>
</div>
</div>
</body>
</html>


f = open('text.txt','r')
html = f.read()              # html里是文本里的内容
f.close()

# 需要寻找的<title>只出现一次,search()只返回第一个匹配的元素,不用遍历全部,效率更高
title = re.search('<title>(.*?)</title>',html,re.S).group(1)    # 爬取标题
print title

links = re.findall('href="(.*?)"',html,re.S)                    # 爬取链接
for each in links:
print each

# 抓取部分文字,先大再小
text_field = re.findall('<ul>(.*?)</ul>',html,re.S)[0]    # 先抓大:把范围缩小至<ul> </ul>,【html】→【text_field】
the_text = re.findall('">(.*?)</a>',text_field,re.S)      # 在text_field 里再次findall()
for every_text in the_text:
print every_text
输出
极客学院爬虫测试
http://jikexueyuan.com/welcome.html http://jikexueyuan.com/1.html http://jikexueyuan.com/2.html http://jikexueyuan.com/3.html
这是第一条

这是第二条

这是第三条

2、使用sub实现换页功能

old_url = 'http://www.jikexueyuan.com/course/android/?pageNum=2'
total_page = 20

# sub实现翻页
for i in range(2, total_page + 1):    # range范围不包含上界,需要+1
new_link = re.sub('pageNum=\d+', 'pageNum=%d' % i, old_url, re.S)  # i的范围2~20替换数字实现翻页
print new_link
输出 http://www.jikexueyuan.com/course/android/?pageNum=2 http://www.jikexueyuan.com/course/android/?pageNum=3 http://www.jikexueyuan.com/course/android/?pageNum=4 http://www.jikexueyuan.com/course/android/?pageNum=5 http://www.jikexueyuan.com/course/android/?pageNum=6 http://www.jikexueyuan.com/course/android/?pageNum=7 http://www.jikexueyuan.com/course/android/?pageNum=8 http://www.jikexueyuan.com/course/android/?pageNum=9 http://www.jikexueyuan.com/course/android/?pageNum=10 http://www.jikexueyuan.com/course/android/?pageNum=11 http://www.jikexueyuan.com/course/android/?pageNum=12 http://www.jikexueyuan.com/course/android/?pageNum=13 http://www.jikexueyuan.com/course/android/?pageNum=14 http://www.jikexueyuan.com/course/android/?pageNum=15 http://www.jikexueyuan.com/course/android/?pageNum=16 http://www.jikexueyuan.com/course/android/?pageNum=17 http://www.jikexueyuan.com/course/android/?pageNum=18 http://www.jikexueyuan.com/course/android/?pageNum=19 http://www.jikexueyuan.com/course/android/?pageNum=20
3.4 实战——制作文本爬虫

* 暂时使用“人肉爬虫”;

* 手动将网页【https://www.nowcoder.com/courses】源代码保存到【nowcoder_source.txt】中。

* 运行前需要配置





#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import requests

f = open('nowcode_source.txt','r')
source_html = f.read()              # html里是文本里的内容
f.close()

pic_url = re.findall('<div class="course-pic"><img src="(.*?)"',source_html,re.S)

i = 0
for each in pic_url:
print 'now downloading:' + each
pic = requests.get("http:"+each)         # get每张图片
fp = open("%d.jpg"%(i),'wb')             # 强制全部以.jpg的格式保存了
fp.write(pic.content)                    # 保存到本地文件
fp.close()
i += 1


图片爬取成功



输出
now downloading://static.nowcoder.com/live/4/217x145.png

now downloading://static.nowcoder.com/vod/7/217x145.png

now downloading://static.nowcoder.com/images/courselist/vod_course_chengyun_217x145.png

【# .…略…】

now downloading://uploadfiles.nowcoder.com/images/20170717/59_1500270283620_642FCEA8E7E6E7F22BA03B4FBD1612C0

now downloading://uploadfiles.nowcoder.com/images/20170717/59_1500270308088_08BF4382A2512CC13B0D0F81E84CFB4C

now downloading://uploadfiles.nowcoder.com/images/20170210/9859373_1486714945522_F0EE18EC0C3DB4D0103D98A142E6ED51

(二)【Requests 介绍和安装】
3.5 Requests 介绍和安装

1、Requests:HTTP for Humans

(1)完美替代Python的urllib2模块

(2)更多的自动化

(3)更友好的用户体验

(4)更完善的功能

* 安装方法:

Windows:pip install requests

Linux:sudo pip install requests

2、第三方库安装技巧

(1)少用easy_install 因为只能安装不能卸载

(2)多用pip方式安装

(3)撞墙了怎么办?请戳->  http://www.lfd.uci.edu/~gohlke/pythonlibs/  

* Ctrl+F搜索对应第三方库,下载*.whl文件;

* 把后缀*.whl改为*.zip,解压缩;

* 复制其中的request文件夹(另外两个"request-xxx"不用复制)到python安装目录的Lib文件夹中(D:\python27\Lib)

3.6 第一个网页爬虫

* 使用Requests获取网页源代码,再使用正则表达式匹配出感兴趣的内容,这是单线程简单爬虫的基本原理。

(1)直接获取源代码

〖例〗爬取百度python吧首页的源代码http://tieba.baidu.com/f?ie=utf-8&kw=python

import requests

html = requests.get('http://tieba.baidu.com/f?ie=utf-8&kw=python')
print html.text


(2)修改http头获取源代码(反爬虫)

* 按(1)中代码若出现“403 Forbidden”则需要修改headers。

〖例〗爬取网页http://jp.tingroom.com/yuedu/yd300p/

#! /usr/bin/env python2.7
# coding=utf-8
import requests
import re
# 下面三行是编码转换的功能,大家现在不用关心。
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

# headers是我们自己构造的一个字典,里面的key保存了user-agent
# 让对方网站误以为是一个浏览器在访问,而不是一个爬虫在访问。
_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
html = requests.get('http://jp.tingroom.com/yuedu/yd300p/',headers = _headers)

html.encoding = 'utf-8'  # 这一行是将编码转为utf-8否则中文会显示乱码。
print html.text         # 获取网页的源代码

# 使用正则表达式匹配内容
chinese = re.findall('color: #039;">(.*?)</a>',html.text,re.S)
for each in chinese:
print each

* 如何获取User-Agent




3.7 向网页提交数据

 【注:由于课程可能是前几年出的,这一节中用到的网页已经有变化,实际上不是视频中出现的样子了。

所以本节没有进行实验操作。以下部分图片来自 视频截图,而不是我自己实际操作的截图;没有运行出一样的结果不要觉得奇怪】

1、Get与Post介绍

(1)Get是从服务器上获取数据;Get通过构造url中的参数来实现功能

(2)Post是向服务器传送数据(并获取它的返回值);Post将数据放在header提交数据

2、分析目标网站

网站地址:https://www.crowdfunder.com/browse/deals

分析工具:Chrome-审核元素-Network

* 点击show more 获取更多信息;

* 因为是"异步加载",所以show more之后网址没有变化;

* show more之后的内容在网页源代码中找不到;

3、Requests的表单提交

核心方法:request.post

核心步骤:构造表单-提交表单-获取返回信息





#! /usr/bin/env python2.7
# coding=utf-8
import requests
import re

# url = 'https://www.crowdfunder.com/browse/deals'
url = 'https://www.crowdfunder.com/browse/deals&template=false'
dc9f

# html = requests.get(url).text
# print html

# 注意这里的'true'是字符串;page后面跟的数字是字符不是数字1(加引号)。
data = {'entities_only': 'true', 'page': '3'}                           # data的值见上图审查元素
html_post = requests.post(url, data=data)

title = re.findall('"card-title">(.*?)</div>', html_post.text, re.S)
for each in title:
print each


3.8 实战——极客学院课程爬虫

目标网站:http://www.jikexueyuan.com/course/

目标内容:课程名称,课程介绍,课程时间,课程等级,学习人数

涉及知识:Requests获取网页/ re.sub换页/正则表达式匹配内容

#! /usr/bin/env python2.7
# coding=utf-8
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

class spider(object):
def __init__(self):
print u'开始爬取内容。。。'

#getsource用来获取网页源代码
def getsource(self,url):
html = requests.get(url)
return html.text

#changepage用来生产不同页数的链接l
def changepage(self,url,total_page):
now_page = int(re.search('pageNum=(\d+)',url,re.S).group(1))
page_group = []
for i in range(now_page,total_page+1):
link = re.sub('pageNum=\d+','pageNum=%s'%i,url,re.S)
page_group.append(link)
return page_group        # 返回所有页码的网址列表

#geteveryclass用来抓取每个课程块的信息
def geteveryclass(self,source):
everyclass = re.findall('(<li deg="".*?</li>)',source,re.S)
return everyclass

#getinfo用来从每个课程块中提取出我们需要的信息
def getinfo(self,eachclass):
info = {}
info['title'] = re.search('target="_blank">(.*?)</a>',eachclass,re.S).group(1)
info['content'] = re.search('</h2><p>(.*?)</p>',eachclass,re.S).group(1)
timeandlevel = re.findall('<em>(.*?)</em>',eachclass,re.S)    # 分析中发现时间和等级的元素都在<em>标签中,则本行匹配出两个元素
info['classtime'] = timeandlevel[0]
info['classlevel'] = timeandlevel[1]
info['learnnum'] = re.search('"learn-number">(.*?)</em>',eachclass,re.S).group(1)
return info

#saveinfo用来保存结果到info.txt文件中
def saveinfo(self,classinfo):
f = open('info.txt','a')    # 以追加打开文件
for each in classinfo:
f.writelines('title:' + each['title'] + '\n')
f.writelines('content:' + each['content'] + '\n')
f.writelines('classtime:' + each['classtime'] + '\n')
f.writelines('classlevel:' + each['classlevel'] + '\n')
f.writelines('learnnum:' + each['learnnum'] +'\n\n')
f.close()

if __name__ == '__main__':     # 程序入口

classinfo = []            # 所有课程的信息的列表,每个课程的信息是一字典
url = 'http://www.jikexueyuan.com/course/?pageNum=1'
jikespider = spider()     # 实例化了spider类
all_links = jikespider.changepage(url,20)
for link in all_links:
print u'正在处理页面:' + link
html = jikespider.getsource(link)
everyclass = jikespider.geteveryclass(html)   # 先抓大:获取每个课程的代码部分
for each in everyclass:                      # 再抓小:获取每个课程的各个信息
info = jikespider.getinfo(each)
classinfo.append(info)
jikespider.saveinfo(classinfo)


(三)【XPath 与多线程爬虫】
3.9 神器 XPath 的介绍与配置

1、XPath(Xml Path Language/可扩展标记语言路径语言 )

*  XPath 是一门语言;可以在XML文档中查找信息;支持HTML;通过元素和属性进行导航

*  即:可以用来提取信息;比正则表达式厉害、简单

【百度百科】XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是
XPath 很快的被开发者采用来当作小型查询语言。

2、如何安装使用XPath

(1) 安装lxml库

(2) from lxml import etree

(3) Selector = etree.HTML(网页源代码) TIP etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了】

(4) Selector.xpath(xxxxxx)


3.10 神器 XPath 的使用

(1)XPath与HTML结构——树状结构、逐层展开、逐层定位、寻找独立节点

(2)获取网页元素的Xpath——手动分析法;Chrome生成法

(3)应用XPath提取内容

① //定位根节点

② /往下层寻找  (可以通过属性定位标签div[@id="xxx"])

③ 提取文本内容:/text()

④ 提取属性内容: /@id

* 【注意对比以上两种@的作用】

【过程:get网页源码 → etree分析源码 → 指定xpath → 输出内容】

#! /usr/bin/env python2.7
# coding=utf-8
from lxml import etree
html = '''
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>测试-常规用法</title>
</head>
<body>
<div id="content">
<ul id="useful">
<li>这是第一条信息</li>
<li>这是第二条信息</li>
<li>这是第三条信息</li>
</ul>
<ul id="useless">
<li>不需要的信息1</li>
<li>不需要的信息2</li>
<li>不需要的信息3</li>
</ul>

<div id="url">
<a href="http://jikexueyuan.com">极客学院</a>
<a href="http://jikexueyuan.com/course/" title="极客学院课程库">点我打开课程库</a>
</div>
</div>

</body>
</html>
'''

selector = etree.HTML(html)

#提取文本
content = selector.xpath('//ul[@id="useful"]/li/text()')  # 提取标签中的内容,@:通过属性定位标签
for each in content:
print each

#提取属性
link = selector.xpath('//a/@href')
for each in link:
print each

title = selector.xpath('//a/@title')    # @:提取属性的信息
print title[0]

输出

这是第一条信息

这是第二条信息

这是第三条信息
http://jikexueyuan.com http://jikexueyuan.com/course/
极客学院课程库

3.11 神器 XPath 的特殊用法

1、以相同的字符开头

[starts-with(@属性名称, "属性字符相同部分")]

〖例〗//div[starts-with(@id,"test")]/text()
  <div id="test-1">需要的内容1</div>

  <div id="test-2">需要的内容2</div>

  <div id="testfault">需要的内容3</div>

#! /usr/bin/env python2.7
# coding=utf-8
from lxml import etree

html1 = '''
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="test-1">需要的内容1</div>
<div id="test-2">需要的内容2</div>
<div id="testfault">需要的内容3</div>
</body>
</html>
'''

selector = etree.HTML(html1)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
print each
输出

需要的内容1

需要的内容2

需要的内容3

2、标签套标签

string(.)

#! /usr/bin/env python2.7
# coding=utf-8
from lxml import etree

html2 = '''
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="test3">
1明月几时有?
<span id="tiger">
2把酒问青天。
<ul>3不知天上宫阙,
<li>4今夕是何年。</li>
</ul>
5我欲乘风归去,
</span>
6又恐琼楼玉宇。
</div>
</body>
</html>
'''

selector = etree.HTML(html2)
content_1 = selector.xpath('//div[@id="test3"]/text()')  # 这样只能提取当前id的div内容,而无法获得嵌套标签的内容
for each in content_1:
print each

print "————————————"

data = selector.xpath('//div[@id="test3"]')[0]       # 先取大获得test3标签内的所有内容
info = data.xpath('string(.)')                       # 再对test这个div内的内容使用xpath为string(.),获取全部文本
content_2 = info.replace('\n','').replace(' ','')    # 转换文本中的回车&空格
print content_2
输出

       1明月几时有?

        

        6又恐琼楼玉宇。

    

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

1明月几时有?2把酒问青天。3不知天上宫阙,4今夕是何年。5我欲乘风归去,6又恐琼楼玉宇。

〖分析〗在info 之后设一个断点,观察info的值:包含了文本以及回车、空格



3.12 Python 并行化介绍与演示

1、Python并行化介绍——多个线程同时处理任务、高效、快速

2、Map的使用(在此仅作了解,之后会在框架中学到更高效的多线程爬虫)

* map 函数一手包办了序列操作、参数传递和结果保存等一系列的操作。

① from multiprocessing.dummy import Pool

② pool = Pool(4)     #四核计算机写4,八核计算机写8,效率更高

③ results = pool.map(爬取函数, 网址列表)

#! /usr/bin/env python2.7
# coding=utf-8

from multiprocessing.dummy import Pool as ThreadPool
import requests
import time

def getsource(url):                 # get网页源代码
html = requests.get(url)

urls = []                             # 【单线程爬取】,存放20个地址到urls列表

for i in range(1,21):                # 生成20个地址
newpage = 'http://tieba.baidu.com/p/3522395718?pn=' + str(i)
urls.append(newpage)

time1 = time.time()
for i in urls:
print i
getsource(i)                      # 对urls中的20个地址爬取源码
time2 = time.time()
print u'单线程耗时:' + str(time2-time1)

pool = ThreadPool(4)                  # 【并行化爬取】,初始化实例
time3 = time.time()
results = pool.map(getsource, urls)   # 使用map连接自定义的getsource函数以及urls列表,进行多线程爬取
pool.close()
pool.join()                           # join()方法表示等待子进程结束以后再继续往下运行,通常用于进程间的同步。
time4 = time.time()
print u'并行耗时:' + str(time4-time3)
输出

单线程耗时:6.60800004005

并行耗时:2.01599979401

3.13 实战——百度贴吧爬虫

目标网站:http://tieba.baidu.com/p/3522395718

目标内容:跟帖用户名,跟帖内容,跟帖时间

涉及知识:Requests获取网页;XPath提取内容;map实现多线程爬虫

#! /usr/bin/env python2.7
# coding=utf-8
from lxml import etree
from multiprocessing.dummy import Pool as ThreadPool
import requests
import json   # 贴吧的编码为 JSON 格式数据
import sys    # 把编码强制转换为utf-8,才能正确输出文本
reload(sys)
sys.setdefaultencoding('utf-8')

'''重新运行之前请删除content.txt,因为文件操作使用追加方式,会导致内容太多。'''

def towrite(contentdict):
f.writelines(u'回帖时间:' + str(contentdict['topic_reply_time']) + '\n')
f.writelines(u'回帖内容:' + unicode(contentdict['topic_reply_content']) + '\n')
f.writelines(u'回帖人:' + contentdict['user_name'] + '\n\n')

def spider(url):
html = requests.get(url)                # get网页源码
selector = etree.HTML(html.text)        # etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了
content_field = selector.xpath('//*[@class="l_post j_l_post l_post_bright  "]')  # 先抓大,整体抓取每一条回帖包含所有信息标签的内容

item = {}
for each in content_field:
reply_info = json.loads(each.xpath('@data-field')[0].replace('"',''))  # 对每贴回帖内容信息再次xpath,此时不需要//;信息在属性中:转换一个转义字符为空
author = reply_info['author']['user_name']
# content = each.xpath('div[@class="d_post_content_main"]/div/cc/div/text()')
content_1 = each.xpath('div[@class="d_post_content_main"]/div/cc/div')[0]
content_2 = content_1.xpath("string(.)")    # 由于某些用户的文本有被附加的边框效果修饰,会多嵌套一层<div>,所以用string(.)解决嵌套标签的文本
content = content_2.replace(' ','')         # 每行前面有多个空格,将空格删除

reply_time = reply_info['content']['date']

print 1,content
print 2,reply_time
print 3,author,"\n"
item['user_name'] = author                  # 将信息写入字典
item['topic_reply_content'] = content
item['topic_reply_time'] = reply_time
towrite(item)                               # 将字典传给towrite准备写入文件

if __name__ == '__main__':
pool = ThreadPool(4)
f = open('content.txt','a')                     # 以追加形式打开文件content.txt

page = []                                       # 生成网页的前20页的地址,存入page
for i in range(1,21):
newpage = 'http://tieba.baidu.com/p/3522395718?pn=' + str(i)
print newpage
page.append(newpage)

results = pool.map(spider, page)                # 连接20个地址与spider函数进行多线程爬取
pool.close()
pool.join()
f.close()


输出(仅截取部分)



输出的content.txt文本

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: