基础知识补充了,现在看看具体代码:
第二步的内容是下载了三个页面,我也不知道用来干嘛的,因为是完整保存下来,没有经过分析提取。或者第三部会有用到把。
还有要注意的是,里面的内容没有访问之后挂起程序一段时间。虽然只是三个页面,如果执行太多次,不知道会不会被服务器抓住。
被抓住怎么办?其实抓不抓爬虫这东西,只要你不是那种恶意爬虫,人家一般都是不管的了。所以要对服务器有好一点。
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/小说/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=["","",1450165591,"http://www.douban.com/"]; 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/小说/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/小说/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的内容了。
