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

先补充一下网页访问的流程 点击打开链接

补充一些概念和知识:
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的内容了。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值