乳母レベルの爬虫類のゼロベースのワンストップ チュートリアル (超詳細)

1. 準備作業:

1. Web ページの分析:

目的の Web ページに入り、キーボードの F12 を押します。図の丸で囲まれた部分を知っておく必要があります。

矢印:

この小さな矢印は非常に実用的で、通常の Web ページのどの部分をクリックすると、コード領域が強調表示され、対応するコードが表示されます。

要素:

Web ページのソース コードが含まれており、ここから多くのデータが取得されます。

通信網:

ネットワーク作業記録は、下図の順にクリックすると多くの回答情報が得られます。例:リクエストヘッダー(Header)情報、Cookie、User-Agentなど、機能は以下の通りです。 

2. 環境構成:

 事前にダウンロードする必要があり、ダウンロードのこの部分はオンラインで検索できるため、ここではあまり説明しません。

Python パッケージのインストール:

bs4->BeautifulSoup (Web ページの解析とデータ取得用)

re->リテラル一致のための正規表現

urllib.request、urllib.error->Web ページのデータを取得する URL を指定します

xlwt→Excel操作

sqlite3->データベース操作の実行#このチュートリアルはゼロベースのプログラミングを目的としており、データベース操作は含まれません。これは省略できます。

(他のものは後で使用します。後で参照)

2. 建設プロセス:

4 つのモジュール: get-parse-save-visualize。対応する関数は後で記述します。

1. Webページデータの取得

        まずは Web ページのデータを取得します。Web ページのデータを取得したい場合は、対象の Web ページにリクエストを送信する必要があります。リクエストの方法は多数あります。Python クローラーで最も一般的に使用されるメソッドは Get と Post です。ここにこれら 2 つのリクエストの使用方法を紹介します。

        リクエストがどのように行われるかをテストするサイトは次のとおりです。

httpbin.org icon-default.png?t=M3C8http://httpbin.org/

 [HTTP メソッド] を開いてクリックします。

 テスト方法を選択します。

まず、Get リクエストを作成しましょう。

import urllib.request as ur

res = ur.urlopen("http://httpbin.org/get")
print(res.read().decode('utf-8'))

リクエスト メソッドの使用は非常に簡単で、通常はリクエスト ヘッダーを追加するだけでよく、データ パケットやその他のパラメータは必要ありません。 

Post リクエストの実行方法を見てみましょう。

        post リクエストでは、データ パケットを辞書の形式でカプセル化し、それをバイナリ形式にデコードして、アクセスする Web ページに渡す必要があります。同時に、URL の後に /post ロゴが必要です。次に、データ パケットを渡します。コードは次のとおりです。

import urllib.request as ur
import urllib.parse as up

data = bytes(up.urlencode({"hello":"world"}),encoding="utf-8")#字典封装数据包解码成2进制
res = ur.urlopen("http://httpbin.org/post",data=data)#使用post请求
print(res.read().decode('utf-8'))

では、このリクエストにはどのような情報が含まれているのでしょうか? 上記のコードを実行して確認してみましょう。

 

上の画像は、Web サイトが受け取ったリクエスト、つまりデータ情報です。あなたのエージェントが直接 python-urllib を書くのは非常に恥ずかしいことです。これは間違いなくあなたがアクセスする Web ページを「私はクローラーです、そしてあなたをクロールするためにここにいます!」と挑発するものです。これを行うのは間違いなく非常に愚かです。一般的に包括的な Web サイトは、無視してください。ただし、より強力な Web サイトに遭遇した場合は、418 または 403 で応答する必要があります。

したがって、通常はクローラーを偽装する必要があります。つまり、Python の代わりにブラウザーの ID を使用して情報をクロールする必要があります。カモフラージュの方法については後で説明しますが、心配しないで、最初に他の操作を見てみましょう。

タイムアウト処理:

import urllib.request as ur

res = ur.urlopen("http://httpbin.org/get",timeout=0.01)
print(res.read().decode('utf-8'))

応答時間がタイムアウトを超える場合は、プログラムが応答していないことを意味し、この時点でエラーが報告されます。次にタイムアウトを行います。

* ここではタイムアウト効果をテストするために timeOut を 0.01 に設定しています。

 

import urllib.request as ur
import urllib.error

try:
    res = ur.urlopen("http://httpbin.org/get",timeout=0.01)
    print(res.read().decode('utf-8'))
except urllib.error.URLError as e:
    print("Time Out!")

 

ステータス コードを確認します。
 

import urllib.request as ur
import urllib.error

res = ur.urlopen("http://douban.com")
print(res.status)

 

プロンプト 418 は、クローラーの ID が公開されていることを証明します。

出力ページヘッダー:

 

import urllib.request as ur
import urllib.error

res = ur.urlopen("http://baidu.com")
print(res.getheaders())

 比較する:

変わりはない。

上記の例は主に、requset の機能が非常に強力であり、それが取得する情報は Web ページ上で見つけることができるすべての情報であることを説明することを目的としています。

 情報を取得します。

import urllib.request as ur
import urllib.error

res = ur.urlopen("http://www.baidu.com")
#print(res.getheaders());
print(res.getheader("Set-Cookie"))

Request 関数は Web ページ上のすべての情報にアクセスできるようですので、Web ページのプロキシの情報も取得できます。このプロキシを通じて、クローラを偽装して、クローラが検出されないようにすることができます。 Webサイト。

クローラーを偽装 - Web プロキシをシミュレートします。

まず、ブラウザのプロキシ情報を見つけます。

        F12 -- ネットワーク -- ヘッダー -- ユーザーエージェント

 

1. これをコピーしてコードに貼り付け、キーと値のペアにカプセル化します。

        プロキシをカプセル化してもクローラであることが判明する場合は、Web サイトの混乱をさらに強化するために、さらにいくつかの情報をカプセル化します。

通常、リモート アドレスなども使用されます。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}

2. リクエストメソッドを設定します: (get は write/get を必要としません)

req = ur.Request(url = url,data=data,headers = headers,method="POST")

 

3. Web ページのソース コードを読みます。

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up

url = "http://httpbin.org/post"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}

data = bytes(up.urlencode({'name':'eric'}),encoding='utf-8')
req = ur.Request(url = url,data=data,headers = headers,method="POST")
res = ur.urlopen(req)
print(res.read().decode("utf-8"))

 

出力結果:

 お母さんはもう私の爬虫類が見つかることを心配する必要はありません。

次に、get リクエストを使用して、新しく検出された Web サイトにアクセスします。

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up

url = "https://douban.com"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}

req = ur.Request(url = url,headers = headers)
res = ur.urlopen(req)
print(res.read().decode("utf-8"))

 

敵内部への侵入に成功することが情報獲得の第一歩となる。 

次のようにデータを取得します。

URLの例:Doubanムービートップ250

(1) 指定したページ情報を取得する

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up

#得到一个指定的URL内容

def askURL(url):
    #模拟请求头
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}
    #保存网页信息的字符串
    html=""
    #请求网页信息
    req = ur.Request(url,headers=header)
    try:
        res = ur.urlopen(req)
        html=res.read().decode("utf-8")
        print(html)
    except ue.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)

if __name__ == "__main__":
    url = "https://movie.douban.com/top250?end=249&filter="
    askURL(url)
    print(1)

ループを使用して複数ページの情報を取得します。

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up

#得到一个指定的URL内容
def askURL(url):
    #模拟请求头
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}
    #保存网页信息的字符串
    html=""
    #请求网页信息
    req = ur.Request(url,headers=header)
    try:
        res = ur.urlopen(req)
        html=res.read().decode("utf-8")
        print(html)
    except ue.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

#爬取网页
def getData(url):
    dataList = []
    for i in range(0,10):#调用获取页面信息函数10次250条
        url = url+str(i*25)#左闭右开
        html = askURL(url)#保存获取到的网页源码
        #逐一解析



if __name__ == "__main__":
    url = "https://movie.douban.com/top250?start="
    #1、爬取网页
    dataList = getData(url)
    savepath = ".\\豆瓣电影Top250.xls"

 

2. Webページデータを分析する

 Web ページのデータを解析するために一般的に使用されるライブラリはBeautifulSoupです。

例:百度、ご存知でしょう

(1)、Web ページのタグ (ラベル) を取得します。

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.title)
print(html.a)

print(type(html.title))
print(type(html.a))

print("标签及其内容:默认是第一个找到的")

出力:

 (2) NavigableString (ラベルのコンテンツ) を取得します。

文字列として:

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.title)
print(html.title.string)

出力:

タグの内容を辞書として取得します。

 

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.a)
print(html.a.attrs)

出力:

(3) BeautifulSoup を入手します (NetEase ドキュメント全体):

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html)
print(type(html))

出力:

 

(4) コメントを取得します (注: 特別な NavigableString 出力には文字列が含まれません):

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.a.string)

出力:

(5) 美しいスープを横断する:

        トラバースという言葉はいつ使用しますか? 通常、リストやツリーなど、一連の継続的に検索可能なデータ構造で使用されます。beautifulsoup で取得したコンテンツも、次のようにリストに保存されます。

 

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.body.contents)

出力:

 

これはリストなので、添字を使用してその中の固定要素を見つけることができます。

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

print(html.body.contents[0])

 コンテンツに加えて、子ノードを取得する方法は他にもあります。

BeautifulSoup - 検索

        上記は、取得したファイルの内容(ノード)をコンテナ(ジェネレータ)に入れ、そこからトラバースして取得したい特定の情報(要素)を探すトラバーサルメソッドです。

次に、検索を通じて目的のコンテンツを見つけるためのより実用的で便利な方法を紹介します。

(1)find_all()

        文字列フィルタリング: 文字列と完全に一致するものを見つけます。

import urllib.request as ur
from bs4 import BeautifulSoup

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all("a")
print(t_list)

(2) 正規表現検索: search() メソッドを使用してコンテンツを照合します。

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re


url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(re.compile("a"))
print(t_list)

 

今回の出力内容は明らかに前回とは異なります。正規表現を使用する場合、「a」だけの文字列を検索するのではなく、正規表現に一致する内容に応じて検索する必要があるからです。

ただし、同じ点は、検索の範囲がすべてのラベルであり、文字列検索「a」は、タグのラベルを検索することです。

正規表現検索「a」は、タグ内にaが含まれるタグを検索します。

(3) メソッド:関数を渡し、関数に従って検索します。

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(name_is_exists)

print(t_list)

 

名前を持つすべてのタグを検索します。

(4) kwargs(パラメータ)検索

 タグ内で id=head を含むフィールドを探します。

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(id = "head")

print(t_list)

 

このハイパーリンクのあるフィールドを見つけます。

mport urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(href = "http://news.baidu.com")

print(t_list)

 

(5) text テキストパラメータ         

        テキストコンテンツを取得する

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(text = "hao123" )

for i in t_list:
    print(i)

 

リストを使用してテキストを検索することもできます

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(text = ["hao123","新闻","视频"] )

for i in t_list:
    print(i)

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all(text = re.compile("\d") )#用正则表达查找带有特定内容的文本字符串

for i in t_list:
    print(i)

 

(6) リミットパラメータ

検索数を制限します。

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.find_all("a",limit=3)

for i in t_list:
    print(i)

 

(7) CSSセレクター

ラベルから探す

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("title")

for i in t_list:
    print(i)

 

 (8) クラス名で検索する

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select(".mnav")

for i in t_list:
    print(i)

 

(9) IDで探す

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("#u1")

for i in t_list:
    print(i)

 

(10) 属性から探す

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("a[class = 'text-color']")

for i in t_list:
    print(i)

 

(11) サブタグで探す

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("div>div")

for i in t_list:
    print(i)

 

(12) 兄弟タグで探す

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("div~div")

for i in t_list:
    print(i)

 

(13) 添え字によるテキストの検索

 

import urllib.request as ur
from bs4 import BeautifulSoup
import re

def name_is_exists(tag):
    return tag.has_attr("name")

url = ur.urlopen("https://baidu.com")

html = BeautifulSoup(url,'html.parser')

t_list = html.select("div~div")

print(t_list[1].get_text())

 

正規表現 - Re ライブラリ

 

 

例えば:

文字列一致テスト:

import re

slist=["aaa","AA","ACA","AAA","CAB"]#等待校验的字符串列表

bat = re.compile("AA")#定义正则表达式

for i in slist:
    res = bat.search(i)#搜索与之匹配的字符串
    print(res)

 

上記の一致は次のように省略することもできます。

import re

bat = re.compile("AA")#定义正则表达式

m = re.search("AA","ABCAA");

print(m)

 

findall() と正規表現の組み合わせ

        ルールに一致する文字をリストに格納します。

import re

print(re.findall("[A-Z]","sdsaASDSAdfdsSasdSda"));

 

sub() 関数 (置換)

import re

print(re.sub("a","A","sdsaASDSAdfdsSasdSda"));#所有a被A替换

 

正規表現では、エスケープ文字の誤用を避けるために、比較するオブジェクトの前に r を付けることをお勧めします。

a = r"\asdas\'"

 

定期的な抽出

ショーシャンク引き換えコード情報を見つけます。

コンテンツを定期的に抽出します。

 

 

#创建正则表达式
#影片链接
findLink=re.compile(r'<a href="(.*?)">')#(.*?):.*:任意字符出现多次 ?:前面的元组内容出现仅出现一次
#影片图片
findImagSrc=re.compile(r'<img.*src="(.*?)"',re.S);#re.S:将换行符忽视掉
#片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
#评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评价人数
findJudge = re.compile(r'<span>(\d)*人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#相关内容
findBd = re.compile(r'<p class="">(.*)</p>',re.S)

タグの解析

クロールされたデータをリストに保存します

 

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up
from bs4 import BeautifulSoup
import re

#得到一个指定的URL内容
def askURL(url):
    #模拟请求头
    header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44"}
    #保存网页信息的字符串
    html=""
    #请求网页信息
    req = ur.Request(url,headers=header)
    try:
        res = ur.urlopen(req)
        html=res.read().decode("utf-8")
        #print(html)
    except ue.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

#创建正则表达式
#影片链接
findLink=re.compile(r'<a href="(.*?)">')#(.*?):.*:任意字符出现多次 ?:前面的元组内容出现仅出现一次
#影片图片
findImagSrc=re.compile(r'<img.*src="(.*?)"',re.S);#re.S:将换行符忽视掉
#片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
#评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评价人数
findJudge = re.compile(r'<span>(\d)*人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#相关内容
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)

#爬取网页
def getData(url):
    dataList = []
    for i in range(0,1):#调用获取页面信息函数10次250条
        url = url+str(i*25)#左闭右开
        html = askURL(url)#保存获取到的网页源码
        #逐一解析
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找比较好的字符串放入列表
            #print(item) 测试:查看电影item全部信息
            data = [] #保存一部电影的所有信息
            item = str(item)
             #影片详情链接
            Link = re.findall(findLink,item)[0]#re库用来通过正则表达式查找指定字符串,0表示只要第一次找到的
            data.append(Link)
            ImgSrc = re.findall(findImagSrc,item)[0]
            data.append(ImgSrc)
            Title = re.findall(findTitle,item)#区分中英文
            if len(Title)==2:
                ctitle=Title[0]
                data.append(ctitle)
                otitle = Title[1].replace("/","")#去掉无关符号
                data.append(otitle)#添加外国名
            else:
                data.append(Title[0])
                data.append(' ')#表中留空
            Rating = re.findall(findRating,item)[0]
            data.append(Rating)
            Judge = re.findall(findJudge,item)[0]
            data.append(Judge)
            Inq = re.findall(findInq,item)
            if len(Inq)!=0:
                Inq=Inq[0].replace("。","")#去掉句号
                data.append(Inq)
            else:
                data.append(" ")#表留空
            Bd = re.findall(findBd,item)[0]
            Bd = re.sub('<br(\s+)?/>(\s+)?'," ",Bd)#去掉<br/>
            Bd = re.sub('/'," ",Bd)#去掉/
            data.append(Bd.strip())#去掉前后空格
            dataList.append(data)#把处理好的一部电影信息放入dataList
        print(dataList)
        return dataList

if __name__ == "__main__":
    url = "https://movie.douban.com/top250?start="
    #1、爬取网页
    dataList = getData(url)
    savepath = ".\\豆瓣电影Top250.xls"

3. データの保存

データを Excel に保存する

4段階の保存方法:

テーブルを作成する

子テーブルを作成する

データ入力

セーブデータ

import xlwt

workbook = xlwt.Workbook(encoding="utf-8")#创建workbook对象
worksheet = workbook.add_sheet('sheet1')#创建工作表
worksheet.write(0,0,'hello')#0行0列存入内容hello
workbook.save('student.xls')#保存数据

例: Python を使用して Excel で九九の九九を出力します。

import xlwt

workbook = xlwt.Workbook(encoding="utf-8")#创建workbook对象
worksheet = workbook.add_sheet('sheet1')#创建工作表
for k in range(1,10):
    for i in range(1,10):
        if i<=k:
            worksheet.write(k-1,i-1,str(i*k))#0行0列存入内容hello
workbook.save('student.xls')#保存数据

 

以前のコードを改善します。

import urllib.request as ur
import urllib.error as ue
import urllib.parse as up
from bs4 import BeautifulSoup
import re
import xlwt

#创建正则表达式
#影片链接
findLink=re.compile(r'<a href="(.*?)">')#(.*?):.*:任意字符出现多次 ?:前面的元组内容出现仅出现一次
#影片图片
findImagSrc=re.compile(r'<img.*src="(.*?)"',re.S);#re.S:将换行符忽视掉
#片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
#评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#相关内容
findBd = re.compile(r'<p class="">(.*?)</p>',re.S)


def main():
    baseurl = "https://movie.douban.com/top250?start="
    datalist = getData(baseurl)
    savepath = "douban.xls"
    saveData(datalist,savepath)

#得到一个指定的URL内容
def askURL(url):
    #模拟请求头
    header = {"Remote Address":"140.143.177.206:443","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"}
    #保存网页信息的字符串
    html=""
    #请求网页信息
    req = ur.Request(url,headers=header)
    try:
        res = ur.urlopen(req)
        html=res.read().decode("utf-8")
        #print(html)
    except ue.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

#爬取网页
def getData(baseurl):
    dataList = []#用来存储网页信息
    for i in range(0,10):#调用获取页面信息函数10次250条
        url = baseurl+str(i*25)#左闭右开
        html = askURL(url)#保存获取到的网页源码
        #逐一解析
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找比较好的字符串放入列表
            #print(item) 测试:查看电影item全部信息
            data = [] #保存一部电影的所有信息
            item = str(item)
             #影片详情链接
            Link = re.findall(findLink,item)[0]#re库用来通过正则表达式查找指定字符串,0表示只要第一次找到的
            data.append(Link)
            ImagSrc = re.findall(findImagSrc,item)[0]
            data.append(ImagSrc)
            Title = re.findall(findTitle,item)#区分中英文
            if len(Title)==2:
                ctitle=Title[0]
                data.append(ctitle)
                otitle = Title[1].replace("/","")#去掉无关符号
                data.append(otitle)#添加外国名
            else:
                data.append(Title[0])
                data.append(' ')#表中留空
            Rating = re.findall(findRating,item)[0]
            data.append(Rating)
            Judge = re.findall(findJudge,item)[0]
            data.append(Judge)
            Inq = re.findall(findInq,item)
            if len(Inq)!=0:
                Inq=Inq[0].replace("。","")#去掉句号
                data.append(Inq)
            else:
                data.append(" ")#表留空
            Bd = re.findall(findBd,item)[0]
            Bd = re.sub('<br(\s+)?/>(\s+)?'," ",Bd)#去掉<br/>
            Bd = re.sub('/'," ",Bd)#去掉/
            data.append(Bd.strip())#去掉前后空格
            dataList.append(data)#把处理好的一部电影信息放入dataList

    return dataList

def saveData(datalist,savepath):
    print("saving")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)#创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top',cell_overwrite_ok=True)#创建工作表
    col=("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])#列名
    for i in range(0,250):
        print("第%d条"%i)
        data = datalist[i]
        for j in range(0,8):#数据
            sheet.write(i+1,j,data[j]) #保存
    book.save(savepath)#保存


if __name__ == "__main__":
    main()
    print("爬取成功!")

 

期待通りの効果が得られます。

 

 

4. データの視覚化

       ワードクラウドを作成します。

マスク:

 

ワードマップ:

 

        環境構成:

import jieba#分词
from matplotlib import pyplot as plt#绘图数据可视化
from wordcloud import WordCloud#词云
from PIL import Image#图像处理
import numpy as np#矩阵运算
import pandas as  pd
import re

        例:

import jieba#分词
from matplotlib import pyplot as plt#绘图数据可视化
from wordcloud import WordCloud#词云
from PIL import Image#图像处理
import numpy as np#矩阵运算
import pandas as  pd
import re

data = pd.read_excel('douban.xls')#打开Excel文件
data_cy = data.copy()#不影响原数据所以拷贝一份
#print(data.iloc[0:4,:2])#从x开始到第y行的前x列
#print(data.iloc[[0],[2,3]])#第0行的2、3列
list=[]
for i in range(0,250):
    datas = data.iloc[[i],[2]]#获取名字
    datas = str(datas).strip()
    datas = re.sub(r"影片中文名\n\d*","",datas)
    datas = str(datas).strip()#再去掉一次空格
    list.append(datas)

#print(list)#得到影片名字的列表

#获取所有文字
text=""
for item in list:
    text+=item
#print(text)

#分词
cut = jieba.cut(text)
string = " ".join(cut)
print(string)#1220

img = Image.open("kobe.jpg")
img_=np.array(img)
wc=WordCloud(
    mask=img_,
    background_color='white',
    font_path='msyh.ttc'
    )

wc.generate_from_text(string)

fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off')
plt.savefig("D:\代码文件夹\VS代码\PythonApplication30\PythonApplication30\wc.jpg")

 

おすすめ

転載: blog.csdn.net/qq_51701007/article/details/124301264