爬虫-使用Python3爬取360DOC文档

个人博客:http://lixiaohui.live

tags:
Python3、爬虫、网页、requests、re、正则表达式

问题描述

浏览网页的时候遇到这篇笔记:
http://www.360doc.com/content/07/0310/18/17841_392130.shtml
想要把页面上的书籍全下载下来,一共有80多本,手动点击下载太慢,想要快速批量地把下载链接爬取下来,于是用Python写了一个小程序。

爬虫设计

  • 先用requests爬取页面内容,
  • 再用re抽取书名和下载链接,
  • 将结果保存到pandas.DataFrame,
  • 最后保存至csv文件

爬取步骤

1、页面抓取
2、正则表达式解析
3、保存到csv文件
4、下载电子书文件


1、页面抓取

requests 是Python3里十分好用的网页爬取解析库,较之内置的urllib2使用起来要方便得多,而且Python3开始已经不支持urllib2了,在这里我使用的是Python 3.5。

Requests is an elegant and simple HTTP library for Python, built for human beings.

一点使用入门:

使用requests解析网页内容十分简单:

  • 使用GET方式获取网页:
r = requests.get('https://api.github.com/events')
  • 使用POST方式获取网页:
r = requests.post('http://httpbin.org/post', data = {'key':'value'})

在上面两个示例中,我们尝试使用requests获取github上的某些信息,读取网页内容使用:

r.text

返回的HTTPResponse对象r具有的属性参照下表:

属性名 结果
text HTTP字符
encoding 响应编码,这个值可以改变,改变之后text属性也会根据编码而变化
content 未编码的二进制数据
json() 返回JSON数据
raw 结果的原始字节流
url 请求的URL
status_code 状态码
headers 请求头字典
cookies cookies字典
history 如果发生重定向,所有请求对象都会保存到这里

爬取网页内容

我们引入requests包,使用上述示例内容解析网页并将内容返回给content变量

import requests
url = 'http://www.360doc.com/content/07/0310/18/17841_392130.shtml'
content = requests.get(url).text

可以将从content保存到本地文件:

import os
with open('contentUrl.txt', 'w', encoding = 'utf-8-sig') as txtfile:
    txtfile.write(content)

2、正则表达式解析

re的教程可以从这里进去:Python 正则表达式
re是Python内置的正则表达式包,使用re匹配字符串分两步走:

  • 打包正则表达式字符串:使用re.compile将一个字符串转化为正则表达式对象。
  • 匹配:使用re.findall匹配文本,用法:re.findall(pattern, string),findall接受两个参数,一个是预期找到的字符串,一个是匹配的全文。

这里我们需要找到书名和对应的下载链接,先构造两个正则化对象,代码如下

import re
content = content.replace('\n', '').replace(' ','')#清除所有换行符和空格
bookPatterns = re.compile(r'(《.*?》.*?)<br>')
urlPatterns = re.compile(r'<ahref="(http://www.swdyj.com.*?\.(exe|rar|zip|RAR|chm))"')

bookPatterns是书名的正则化对象,urlPatterns是下载链接的正则化对象。
接下来我们需要对网页文本进行匹配。

bookResult = re.findall(bookPatterns, contents)
bookName = bookResult[1:]
urls = [url[0] for url in re.findall(urlPatterns, contents)]

这里的bookName取返回结果index为1开始的数组是因为匹配的文本第一项(index为0)并不是我们想要的结果。
urls是对匹配结果处理过后得到的正确url,不处理的匹配结果:

[('http://www.swdyj.com/sj/GSQSJS.rar', 'rar'), 
('http://www.swdyj.com/sj/LZT.rar', 'rar'), 
('http://www.swdyj.com/sj/KXZF.rar', 'rar'), 
('http://www.swdyj.com/sj/HDCZ.rar', 'rar'), 
('http://www.swdyj.com/sj/ZQJYX.rar', 'rar'), 
('http://www.swdyj.com/SJ/YDLL.rar', 'rar')]

3、保存到csv文件

这一步我们使用pandas将匹配结果保存到DataFrame对象

import pandas as pd
df = pd.DataFrame(columns = ['Book', 'url'])
df['Book'] = bookName
df['url'] = urls
print(df.head())
with open('results.csv', 'w', encoding = 'utf-8-sig') as csvfile:
    df.to_csv(csvfile, index = False)

需要注意的是encoding = 'utf-8-sig'可以保证保存的文件打开后中文不乱码。

保存结果:



4、下载文件

这个时候就可以畅快地使用BT下载了。



完整代码:

import pandas as pd
import os
import re
import requests

url = 'http://www.360doc.com/content/07/0310/18/17841_392130.shtml'
content = requests.get(url).text
# with open('content.txt', 'w', encoding = 'utf-8-sig') as txtfile:
#   txtfile.write(content)

# with open('content.txt', 'r', encoding = 'utf-8-sig') as txtfile:
#   contents = txtfile.read().replace('\n', '').replace(' ', '')

contents = content.replace('\n', '').replace(' ', '')
bookPatterns = re.compile(r'(《.*?》.*?)<br>')
urlPatterns = re.compile(r'<ahref="(http://www.swdyj.com.*?\.(exe|rar|zip|RAR|chm))"')
bookResult = re.findall(bookPatterns, contents)
bookName = bookResult[1:]
print(re.findall(urlPatterns, contents))
urls = [url[0] for url in re.findall(urlPatterns, contents)]
df = pd.DataFrame(columns = ['Book', 'url'])
df['Book'] = bookName
df['url'] = urls
with open('results.csv', 'w', encoding = 'utf-8-sig') as csvfile:
    df.to_csv(csvfile, index = False)

参考链接:
Requests官方文档:http://docs.python-requests.org/en/master/
Python HTTP库requests 介绍-简书://www.greatytc.com/p/84ea562f0932

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,211评论 4 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 一、前言 这是我第一次写文章,作为一个非计算机,编程类专业的大二学生,我希望能够给像我这样的入门的朋友一些帮助,也...
    梅花鹿数据阅读 2,533评论 5 11
  • 今天我们到学校和昨天一样扫落叶,和昨天不一样的是,我们昨天在操场那儿扫落叶,今天在操场门口扫落叶,这次我们不是分成...
    贤惠的煎蛋饼阅读 260评论 0 0
  • 完美的爱情,让人意志薄弱; 不完美的爱情,伤害人心。 但令身未死,随力报乾坤。 壮心欲填海,苦胆为忧天。 有的人,...
    梦雅星辰阅读 329评论 0 0