Python实例:网络爬虫抓取豆瓣3万本书(2)

    xiaoxiao2021-03-25  105

    先补充一下网页访问的流程 点击打开链接 补充一些概念和知识: 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/小说/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的内容了。

    转载请注明原文地址: https://ju.6miu.com/read-22970.html

    最新回复(0)