先补充一下网页访问的流程
点击打开链接
补充一些概念和知识:
beautifulsoup:老火汤
是用Python写的一个HTML/XML的解析器,可以很好的处理不规范标记并生成剖析树(parse tree)。提供简单又常用的导航(navigating),搜索以及修改剖析树的操作,大大节省编程时间。
安装有点麻烦,可以看看这个: 点击打开链接
urllib模块:
下载网页、资源等用到的库,这个是自带的,不需要安装的
opener 当获取一个URL时使用一个opener。
handler opener是使用处理器handler,所有繁重的工作由handler处理。
http.cookiejsar模块:
也是自带的。处理cookie相关的东西,估计就是保存,读写,发送cookie的东西了。
cookie就是存放在本地电脑的一些短小信息,远程的网站服务端得到请求的时候,会将一些信息,例如用户名和密码等,放到response header中返回给客户端,客户端保存这些信息到本地。再次访问网站的时候,要把对应的cookie信息一起发送给服务器。
*和**
**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16
一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8
*如果是字符串、列表、元组与一个整数N相乘,返回一个其所有元素重复N次的同类型对象,比如"str"*3将返回字符串"strstrstr"
如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中
补充一些概念和知识:
beautifulsoup:老火汤
是用Python写的一个HTML/XML的解析器,可以很好的处理不规范标记并生成剖析树(parse tree)。提供简单又常用的导航(navigating),搜索以及修改剖析树的操作,大大节省编程时间。
安装有点麻烦,可以看看这个: 点击打开链接
urllib模块:
下载网页、资源等用到的库,这个是自带的,不需要安装的
opener 当获取一个URL时使用一个opener。
handler opener是使用处理器handler,所有繁重的工作由handler处理。
http.cookiejsar模块:
也是自带的。处理cookie相关的东西,估计就是保存,读写,发送cookie的东西了。
cookie就是存放在本地电脑的一些短小信息,远程的网站服务端得到请求的时候,会将一些信息,例如用户名和密码等,放到response header中返回给客户端,客户端保存这些信息到本地。再次访问网站的时候,要把对应的cookie信息一起发送给服务器。
*和**
**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16
一个乘号*,如果操作数是两个数字,就是这两个数字相乘,如2*4,结果为8
*如果是字符串、列表、元组与一个整数N相乘,返回一个其所有元素重复N次的同类型对象,比如"str"*3将返回字符串"strstrstr"
如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中
基础知识补充了,现在看看具体代码:
第二步的内容是下载了三个页面,我也不知道用来干嘛的,因为是完整保存下来,没有经过分析提取。或者第三部会有用到把。
还有要注意的是,里面的内容没有访问之后挂起程序一段时间。虽然只是三个页面,如果执行太多次,不知道会不会被服务器抓住。
被抓住怎么办?其实抓不抓爬虫这东西,只要你不是那种恶意爬虫,人家一般都是不管的了。所以要对服务器有好一点。
step2.py
#第二部,获取标签页的内容
from tool.HtmlManager import getHtml
# 抓取分类标签页
tag =getHtml('http://book.douban.com/tag/')#获取html
file = open('web/booktag.html','wb')#保存这些内容
file.write(tag.encode())
file.close()
# 抓取列表页方便测试
tag1 = getHtml("http://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book")
file1 = open('web/books.html','wb')
file1.write(tag1.encode())
file1.close()
# 抓取图书页方便测试
tag3 = getHtml("http://book.douban.com/subject/25862578/?from=tag_all")
file2 = open('web/book.html','wb')
file2.write(tag3.encode())
file2.close()
print("成功")
HtmlManager.py
好吧。我就是喜欢根据我自己的习惯,把文件名也改了。
#通过链接去下载html文件
#内容比较简单
import urllib.request #请求相关
import http.cookiejar #cookie相关
from bs4 import BeautifulSoup#网页结构处理
def getHtml(url):
"""
伪装头部并得到网页内容
"""
cj = http.cookiejar.CookieJar() #cookie类
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))#通过handler来构建opener
#一些html请求报文表头的字段
useragent3 = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'#操作系统,浏览器相关信息
Accept='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'#接受的文件格式
cookie = """Cbid="FccuPZmq//0"; viewed="25923455_25867785_1520363_6397086_6431094_5338398_25862578_26589018_1002898_5922149"; gr_user_id=9fee2430-40d3-4f9d-a5aa-d3e295531497; __utma=30149280.372796509.1449028995.1450149245.1450165592.16; __utmz=30149280.1450149245.15.12.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utma=81379588.1458595321.1449028995.1450149245.1450165592.11; __utmz=81379588.1450149245.10.10.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _pk_id.100001.3ac3=ff3d4ecea493334f.1449028995.11.1450166087.1450149661.; ll="118281"; _pk_ref.100001.3ac3=%5B%22%22%2C%22%22%2C1450165591%2C%22http%3A%2F%2Fwww.douban.com%2F%22%5D; ap=1; ct=y; ps=y; __utmv=30149280.13418; ue="569929309@qq.com"; push_noty_num=0; push_doumail_num=0; __utmc=30149280; __utmc=81379588; gr_session_id=8951b2b8-06a3-4a07-b066-0ee33d2be006; _pk_ses.100001.3ac3=*; __utmb=30149280.2.10.1450165592; __utmt_douban=1; __utmb=81379588.2.10.1450165592; __utmt=1"""#cookie的内容
#增加内容到表头
opener.addheaders = [('User-Agent',useragent3),
('Accept',Accept),
('Cookie', cookie)]
urllib.request.install_opener(opener)#转为全局的opener
#urlopen()是打开这个url,返回一个response对象。read()读取response对象的内容
html_bytes = urllib.request.urlopen(url).read()
html_string = html_bytes.decode('utf-8','ignore')#解码,ignore表示遇到不兼容的就跳过
return html_string#返回解码后的字符串
#代理的地址,要在这里获取最新的,不行就一个个试试吧。http://www.youdaili.net/
# http://www.youdaili.net/Daili/http/34265.html 隔一段时间更新一次的
def getBinaryHtml(url,daili='121.199.25.64:81'):
"""
伪装头部并得到网页原始内容
"""
cj = http.cookiejar.CookieJar()
# 设置IP代理
proxy_support = urllib.request.ProxyHandler({'http':'http://'+daili})#ProxyHandler通过这个方法可以设置代理访问网页
# 开启代理支持,可以传多个handler进去的
opener = urllib.request.build_opener(
proxy_support,
urllib.request.HTTPCookieProcessor(cj),
urllib.request.HTTPHandler)
#不设置代理
#opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
# 用户代理http://blog.csdn.net/u012175089/article/details/61199238
useragent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'
Accept='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'#希望接受的文件格式
opener.addheaders = [('User-Agent',useragent),
('Accept',Accept),
('Cookie', '4564564564564564565646540')]
urllib.request.install_opener(opener)
html_bytes = urllib.request.urlopen(url).read()
return html_bytes
def makeSoup(html_content,parse='html.parser'):
"""
得到网页解析后的对象,方便分拆数据
"""
return BeautifulSoup(html_content,parse)
def test():
getBinaryHtml('http://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book')
#测试
if __name__=='__main__':
#下载标签页
tag =getBinaryHtml('http://book.douban.com/tag/')
file = open('../web/booktag.html','wb')#以写二进制的方式,写入获得的内容
file.write(tag)
file.close()
#下载某个页面
content1 = getHtml("http://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/book")
file1 = open('../web/books.html','wb')
content2 = getHtml("http://book.douban.com/subject/25862578/?from=tag_all")
file2 = open('../web/book.html','wb')
file1.write(content1.encode('utf-8'))
file2.write(content2.encode('utf-8'))
file1.close()
file2.close()
#打开看了一下,发现广告内容也都在,看一下源码。第一次获取的是html。也就是我们保存下来的文件。
#浏览器打开后,就会解析里面的内容,看到图片什么的,就根据url再去下载的。
#所以如果断网了,保存下来的html文件就无法显示里面的url的内容了。