Pythonテクノロジーの共有:クローラー

ウェブデータ収集

urllibモジュールアプリケーション

Pythonを介してWebページデータを取得する方法

トランスコーディングを行う

Webページの資料を準備する

httpdを起動

Apacheのアクセスログから、ログインがpythonで行われていることがわかります

解決してurllibのヘッダー情報を追加する

import urllib.request as u
request = u.Request("http://192.168.86.11") #将网页地址添加到request实例(变量)
request.add_header("User-Agent","Mozilla/5.0 \
(Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0") #为该实例添加头部信息
response = u.urlopen(request) #通过urlopen打开实例(网页地址 和 头部信息)
html = response.read()
print(html)  #访问页面

Linux apacheログを確認する

vim / var / log / httpd / access_log情報レコードにPython情報があるかどうかを確認します

画像をダウンロードするプログラム

import urllib.request as u
request = u.Request("http://192.168.86.11/style/\
u24020836931378817798fm170s6BA8218A7B2128178FA0A49F010080E2w.jpg") #图片地址
request.add_header("User-Agent","Mozilla/5.0 \
(Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0")
response = u.urlopen(request)
html = response.read() #读取的图片的2进制数据
#print(html)
with open("c:\\users\\allen\\desktop\\爬虫.jpg","wb") as f:
    f.write(html)

ウェブページ情報取得プログラムをファンクションモードに変換する必要があります

import urllib.request as u
​
url = "http://192.168.86.11"
​
def get_html(urladdr):
    "我的功能是获取主页的所有源码"
    request = u.Request(urladdr)
    request.add_header("User-Agent","Mozilla/5.0 \
    (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0")
    response = u.urlopen(request)
    html = response.read()
    return html
​
def get_imglist():
    "我的功能是将所有图片信息地址 做成一个大的列表"
    pass
​
def get_imgs():
    "我的功能是下载图片列表中的所有 图片信息 并保存图片"
    pass
​
html = get_html(url)
print(html)

通常の文字列と一致させる方法

単一文字の一致

「。」は任意の1文字に一致します

>>> import re
>>> re.findall(".ood","I say Good not food")
['Good', 'food']
>>> re.findall(".ood","I say Good not food @ood")
['Good', 'food', '@ood']
>>> re.findall(".ood","I say Good not food  ood")
['Good', 'food', ' ood']
>>> re.findall(".ood","I say Good not food \nood")
['Good', 'food']
>>>

[]単一の文字を1つずつ一致させます

>>> re.findall("[fn]ood","I say Good not food nood") #ood以f或者n链接 的字符串
['food', 'nood']
>>> re.findall("[^fn]ood","I say Good not food nood")#ood不是以f或者n链接的字符串 取反
['Good']
>>> re.findall("^[Gfn]ood","Good not food nood") #以G f n 开头的和ood链接的字符串匹配
['Good']
>>> re.findall("^[Gfn]ood","I say Good not food nood")
[]
>>>

\ dは単一の0-9に一致します

>>> re.findall("\d","How old are you? I am 36")
['3', '6']
>>> re.findall("\d\d","How old are you? I am 36")
['36']
>>>

\ wは0-9a-zA-Z_の範囲の1文字と一致します

>>> re.findall("\w","How old are you? I am 36")
['H', 'o', 'w', 'o', 'l', 'd', 'a', 'r', 'e', 'y', 'o', 'u', 'I', 'a', 'm', '3', '6']
>>> re.findall("\w\w\w","How old are you? I am 36")
['How', 'old', 'are', 'you']
>>> re.findall("\w\w","How old are you? I_am 36")
['Ho', 'ol', 'ar', 'yo', 'I_', 'am', '36']
>>>

\ sは空白文字とスペースに一致します

>>> re.findall("\s","\tHow old are you?\r\n")
['\t', ' ', ' ', ' ', '\r', '\n']
>>>

文字の一致のセット

逐語的に一致

>>> re.findall("allen","I am allen")
['allen']
>>> re.findall("allen","I am allenallen")
['allen', 'allen']
>>>

逐語的に一致|異なる文字列を分割

>>> re.findall("food|nood","I say Good not food nood")
['food', 'nood']
>>> re.findall("not|nood","I say Good not food nood")
['not', 'nood']
>>>

*左側の最初の文字が0から無限回出現することを示します

>>> re.findall("go*gle","I like google not ggle goooogle and gogle")
['google', 'ggle', 'goooogle', 'gogle']
>>>

+左側の最初の文字が1から無限回出現することを意味します

>>> re.findall("go+gle","I like google not ggle goooogle and gogle")
['google', 'goooogle', 'gogle']
>>>

?左側の最初の文字が0または1回出現することを意味します

>>> re.findall("go?gle","I like google not ggle goooogle and gogle")
['ggle', 'gogle']

{}左に隣接する文字の出現回数を指定します

>>> re.findall("go{2}gle","I like google not ggle goooogle and gogle")
['google']
>>> re.findall("go{1}gle","I like google not ggle goooogle and gogle")
['gogle']
>>> re.findall("go{1,4}gle","I like google not ggle goooogle and gogle")
['google', 'goooogle', 'gogle']
>>>

上記の情報に従って、Webテストページの画像取得を完了します。

import urllib.request as u
import re

url = "http://192.168.86.11/" #结尾添加左斜杠

def get_html(urladdr):
    "我的功能是获取主页的所有源码"
    request = u.Request(urladdr)
    request.add_header("User-Agent","Mozilla/5.0 \
    (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0")
    response = u.urlopen(request)
    html = response.read()
    return html

def get_imglist(url,html):
    "我的功能是将所有图片信息地址 做成一个大的列表"
    imglist = [] #存储图片地址的一个容器列表
    bytsimglist = re.findall(b"style/\w{60}\.jpg",html)
    for i in bytsimglist: #因为图片地址不全而且是2进制字符串 因此 要进行拼接处理
        imgaddr = url+str(i,encoding='utf8') #拼接并且转换为字符串
        imglist.append(imgaddr) #将地址放入列表中
    return imglist
    

def get_imgs(imglist):
    "我的功能是下载图片列表中的所有 图片信息 并保存图片"
    num = 0 #为了图片名称进行自增
    for imgurl in imglist:
        num += 1
        data = get_html(imgurl)
        with open("%s.jpg" %num,"wb") as f: #图片名字会从1.jpg开始一直到54.jpg
            f.write(data)

html = get_html(url)
#print(html)
imglist = get_imglist(url,html)
#print(len(imglist))
get_imgs(imglist)

ブカコミックウェブサイトリソースクロール

import urllib.request as u
import re
​
#url = "http://www.buka.cn/view/223172/65537.html"
#url = "http://www.buka.cn/view/223578/65537.html"
#url = "http://www.buka.cn/view/221784/65540.html"
url = "http://www.buka.cn/view/219792/65742.html"
​
def get_html(urladdr):
    "我的功能是获取主页的所有源码"
    request = u.Request(urladdr)
    request.add_header("User-Agent","Mozilla/5.0 \
    (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0")
    response = u.urlopen(request)
    html = response.read()
    return html
​
def get_imglist(url,html):
    "我的功能是将所有图片信息地址 做成一个大的列表"
    imglist = [] #存储图片地址的一个容器列表
    bytsimglist = re.findall(b"http://i-cdn.ibuka.cn/pics/\d+/\d+/\w+.jpg",html)
    #print(bytsimglist)
    for i in bytsimglist:
        imglist.append(str(i,encoding='utf8'))
    return imglist
    
​
def get_imgs(imglist):
    "我的功能是下载图片列表中的所有 图片信息 并保存图片"
    num = 0 #为了图片名称进行自增
    for imgurl in imglist:
        num += 1
        data = get_html(imgurl)
        with open("%s.jpg" %num,"wb") as f: #图片名字会从1.jpg开始一直到54.jpg
            f.write(data)
​
html = get_html(url)
#print(html)
imglist = get_imglist(url,html)
#print(imglist)
get_imgs(imglist)

通常のマッチングでの特殊記号の適用

^ $で始まるものが$で終わることを示します

>>> re.findall('^I say',"I say Good not food")
['I say']
>>> re.findall('not food$',"I say Good not food")
['not food']
>>> re.findall('not Good$',"I say Good not food")
[]
>>>

\ b単語の境界を指定_特別な記号ではない

>>> re.findall("allen","allen.com allen_123 allen.com")
['allen', 'allen', 'allen']
>>> re.findall("\ballen\b","allen.com allen_123 allen.com")
[]
>>> re.findall("\\ballen\\b","allen.com allen_123 allen.com")
['allen', 'allen']
>>>

おすすめ

転載: blog.csdn.net/GUDUzhongliang/article/details/108659553