requests + bs4モジュール-単純なクローラーの例-Bilibili列の写真
記事のディレクトリ
セクション1:ステートメント
1.クロールされた画像はすべて、Bilibiliプラットフォームに無料でダウンロードできる画像です。
2.私自身の学習ノートは市販されません。2gの写真をクロールし、バックアップの壁紙としていくつか選択した後、それらはすべて削除されました。
3.この記事に侵害がある場合は、私に連絡して記事を削除してください。
セクション2:ダウンロードリンク分析
ステーションBはコラムが多いので、検索して「鬼滅の刃みどうじ壁紙」を選びました。全部で4ページあります。この記事は最初のページだけをクロールします。
レンダリングは次のとおりです。
まず、ゴーストミビーンズの壁紙から端を這う詳細ページを見つけたい
次に、ソースコードを分析します。
(例として最初の記事を取り上げます)
hrefタグでハイパーリンクを見つけ、クリックして目的
の記事であることを確認します。ただし、クロールするときは** "https:" **と組み合わせる必要があります。
次に、記事に表示されている画像のソースコードを分析します。
(例として最初の画像を取り上げます)
各figureタグには、画像のURLが含まれています。次に、data-srcのコンテンツを抽出します。(しかし、実際にはそうではありません。コードを使用してテキストを取得する場合、そのようなコンテンツはありません。後で見ることができます)
セクション3:コードの記述
1.インポートセクション
import requests
import re
import bs4
import os
2.リクエストヘッダーを追加します
headers = {
'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
3.フォルダを作成します
if not os.path.exists('D:/鬼灭之刃'):
os.mkdir('D:/鬼灭之刃')
4.カプセル化機能
def get_first_url(url): #得到第一个url,即每一篇文章的url,结果是未遍历的
res_1=requests.get(url=url,headers=headers)
html_1=res_1.text
first_url=re.findall('<li.*?<a.*?"(//w.*?search)"',html_1,re.S)
return first_url
この機能の機能は、最初にアクセスした詳細ページを分析し、記事のリンクを構成できるコンテンツを抽出することです
(正規表現によって抽出されます)
以前にも正規表現に関する記事を書きました
def get_second_url(url): #得到第二个url,即文章中每个图片的url,结果是未遍历的
res_2 = requests.get(url=url,headers=headers)
html_2=res_2.text
soup=bs4.BeautifulSoup(html_2,'html.parser')
picture_list = soup.select('.img-box img')
return picture_list
この機能の機能は、記事のコンテンツを分析し、画像リンクを形成できるコンテンツを抽出することです
(bs4を使用して抽出)
def download_picture(url,num1,i): #下载图片
res_3=requests.get(url=url,headers=headers)
picture_data=res_3.content
picture_name='img{}_{}.jpg'.format(num1,i)
picture_path='D:/鬼灭之刃/'+picture_name
with open(picture_path,'wb') as f:
f.write(picture_data)
print(picture_path,'打印成功')
この関数の機能は、画像をダウンロードしてプログレスバーを印刷することです
(最初にメイン関数を記述してから、この関数を追加するのが好きです)
def main():
base_url='https://search.bilibili.com/article?keyword=%E9%AC%BC%E7%81%AD%E4%B9%8B%E5%88%83%E5%BC%A5%E8%B1%86%E5%AD%90%E5%A3%81%E7%BA%B8'
fist_urls=get_first_url(base_url)
num1=1
for first_url in fist_urls:
first_url='https:'+first_url
second_url=get_second_url(first_url)
for i in range(len(second_url)):
picture_urls=second_url[i].get('data-src')
picture_url='https:'+picture_urls
download_picture(picture_url,num1,i)
num1+=1
5.完全なコード
import requests
import re
import bs4
import os
headers = {
'user - agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.116Safari / 537.36'
}
#创建文件夹
if not os.path.exists('D:/鬼灭之刃'):
os.mkdir('D:/鬼灭之刃')
def get_first_url(url): #得到第一个url,即每一篇文章的url,结果是未遍历的
res_1=requests.get(url=url,headers=headers)
html_1=res_1.text
first_url=re.findall('<li.*?<a.*?"(//w.*?search)"',html_1,re.S)
return first_url
def get_second_url(url): #得到第二个url,即文章中每个图片的url,结果是未遍历的
res_2 = requests.get(url=url,headers=headers)
html_2=res_2.text
soup=bs4.BeautifulSoup(html_2,'html.parser')
picture_list = soup.select('.img-box img')
return picture_list
def download_picture(url,num1,i): #下载图片
res_3=requests.get(url=url,headers=headers)
picture_data=res_3.content
picture_name='img{}_{}.jpg'.format(num1,i)
picture_path='D:/鬼灭之刃/'+picture_name
with open(picture_path,'wb') as f:
f.write(picture_data)
print(picture_path,'打印成功')
def main():
base_url='https://search.bilibili.com/article?keyword=%E9%AC%BC%E7%81%AD%E4%B9%8B%E5%88%83%E5%BC%A5%E8%B1%86%E5%AD%90%E5%A3%81%E7%BA%B8'
fist_urls=get_first_url(base_url)
num1=1
for first_url in fist_urls:
first_url='https:'+first_url
second_url=get_second_url(first_url)
for i in range(len(second_url)):
picture_urls=second_url[i].get('data-src')
picture_url='https:'+picture_urls
download_picture(picture_url,num1,i)
num1+=1
if __name__ =='__main__' :
main()
セクション4:補足
この時点で、テキストは終わりに近づいています。上記の小さな問題を見てみましょう。
これは解析の結果であり、これは
Webページを「チェック」した結果です。
違いがあるかどうか、または分析結果が優先されるかどうかを詳しく調べてください。
セクション5:参照ブログ投稿
bs4を初めて使用する場合は、私に教えてください。