python-爬虫入门

今天学了Python爬虫,很有意思,写一下博客记录一下学习过程。

一.爬虫所需要使用到的库

最基本的爬虫仅需要urllib库,re库和chardet库

urllib库是Python内置的处理网络请求的库。对于基本的爬虫我们仅仅需要使用他的内部模块urllib.requset。

urllib.request中所要使用的函数

urllib.request.urlopen(url(网址)) 会返回一个<class 'http.client.HTTPResponse'> 

re库是正则表达式库,用来字符串模式匹配,寻找我们所需要的网页内容。

chardet库是用来获取网页编码方式的库,可以使用chardet.detect()函数获取网页使用的编码格式。



二.爬取网页的思路

首先用先用urllib库爬取网页信息,用chardet库获取网页使用编码,再把爬取的网页信息转换成二进制文件,用解码函数把二进制文件用已知编码解码。这时就可以得到网页的完整信息了。查找原网页你所需要信息的代码。分析其模式,用正则表达式提取他们的信息,最后写入文件夹即可。


三.爬取网页详解

urlopen()函数的用法为

urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=None)

url为网页网址(字符串格式)

data为访问方式,一般默认就行

timeout为访问结束时间

其他的一般都不需修改,使用默认值即可

使用urlopen函数返回的http.client.HTTPResponse对象使用read()函数解析为二进制文件。

chardet.detect()函数返回的是一个字典

# {'encoding': 'ascii', 'confidence': 1.0, 'language': ''} 

其中encoding代表编码,confidence代表精度

这时再用decode()方法解码即可得到整个页面信息。

re库中常用的是函数是match(pattern,string)、search(pattern,string)和findall(pattern,string)

match是只匹配开头,search是从开头开始匹配第一个,findall是匹配全文所有的。



下面给大家带来一个小例子

爬取豆瓣图书出版社名称和销售书的数目



from urllib.request import urlopen
import urllib.request
import chardet
import re

class Publish(object):
    def __init__(self):
        pass

    def getInfo(self,address):
        response = urlopen(address,timeout=2).read()
        char = chardet.detect(response)
        data = response.decode(char['encoding'])
        pattern1 = '<div class="name">(.*?)</div>'
        pattern2 = '<div class="works-num">(.*?) 部作品在售</div>'
        result1 = re.compile(pattern1).findall(data)
        result2 = re.compile(pattern2).findall(data)
        return [result1,result2]
    pass

    def writeTxT(self,address,fileName):
        result = self.getInfo(address)
        f = open(fileName,'w',encoding='utf-8')
        lenth = result[0].__len__()
        for i in range(0,lenth):
            f.write(str(i+1) +'\t' + result[0][i] + '\t' +result[1][i] + '\n')
        pass
        f.close()
    pass
pass



if __name__ == '__main__':
    publish = Publish()
    fileName = 'publish.txt'
    address = 'https://read.douban.com/provider/all'
    publish.writeTxT(address,fileName)
pass

猜你喜欢

转载自blog.csdn.net/Kwong_young/article/details/79965377