【Python クローラー入門】写真や記録情報をテーブルとしてエクスポート


ウェブサイトから画像をダウンロードする


HTTP で Web サイトの画像をダウンロードするには、Web ページのソース コードを取得する、画像のハイパーリンクを取得する、画像のハイパーリンク URL に従って画像をローカル フォルダーにダウンロードする 3 つの部分があります


urllib は、request.urlopen( ) を使用して URL 情報を開いて読み取ります。返されるオブジェクト応答はテキスト オブジェクトのようなもので、read( ) を呼び出すことで読み取ることができます。次のコードは、収集された Web ページの HTML 情報を出力します。
from urllib import request
response = request.urlopen("http://fanyi.baidu.com")
html = response.read()
html = html.decode("utf-8")  # decode()命令将网页信息解码,否则乱码
print(html)

Web ページのエンコード方法を確認します。ブラウザを使用して Web ページのソース コードを表示し、開発者ツールを呼び出して要素を選択するか、F12 ショートカット キーを直接押します。必要なのは、ファイルの先頭にある文字セットを見つけることだけです。 head タグ特定のメタ内)を確認すると、Web ページがどのような種類のエンコーディングを使用しているかがわかります。

画像の説明を追加してください

Web ページ ファイルをローカルにダウンロードするには 2 つの一般的な方法があります。1 つはrequest.urlretrieve() 関数を使用する方法で、もう 1 つはPython のファイル操作 write() 関数を使用してファイルを書き込む方法です以下は、Web サイト上の画像をクロールし、ローカルにダウンロードするためのサンプル コードです。

'''
    第一个简单的爬取图片程序,使用Python3.x和urllib库
'''

import urllib.request
import re
import os


def getHtmlCode(url):  # 该方法传入url,返回url的html源码
    headers = {
    
    
        'User - Agent': 'Mozilla/5.0(Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWEBkIT/537.36(KHTML,like Cecko)Chorme/56.0.2924.87 Mobile Safari/537.36'
    }

    # Request 函数将url添加头部,模拟浏览器访问
    url1 = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(url1).read()  # 将url1页面的源代码保存成字符串
    page = page.decode('GB2312', 'ignore')  # 字符串转码

    return page


def getImg(page):  # 该方法传入html的源码,经过截取其中的img标签,将图片保存到本机
    # 考虑采用https还是http协议
    imgList = re.findall(r'(https:[^\s]*?(jpg|png|gif))', page)
    x = 100
    if not os.path.exists("E:/img1"):
        os.mkdir("E:/img1")

    for imgUrl in imgList:
        try:
            print('正在下载: %s' % imgUrl[0])
            urllib.request.urlretrieve(
                imgUrl[0], 'E:/img1/%d.%s' % (x, imgUrl[1]))
            x += 1
        except:
            continue


if __name__ == '__main__':
    url = 'https://www.book123.info/list?key=python'  # 搜索无名图书python的网址页面
    page = getHtmlCode(url)
    # page = urllib.request.urlopen(url).read()  # 将url1页面的源代码保存成字符串
    # page = page.decode('GB2312', 'ignore')  # 字符串转码
    # page = getHtmlCode(url)
    getImg(page)

ここに画像の説明を挿入

実際、主流の Web サイトにはすでに特定のクローラー対策テクノロジーが導入されているため、ここではクロールの練習用に Wuming Books.com のような非営利 Web サイトを選択しています。アカウントのログイン検証を完了するために Cookie テクノロジーを使用するなど、主流の Web サイトのクロールをさらに調整する必要がある場合があります。



Web サイトのコンテンツ レコードをテーブルとして抽出する


正規表現は使い始めるまでに時間がかかるため、サードパーティのライブラリ BeautifulSoup を借用すると、ラベルの名前に従って Web ページのコンテンツをインターセプトでき、この時点での操作はより直感的になります。

BeautifulSoup は、Python が HTML/XML を処理するための関数ライブラリです。これは、Python の組み込み Web ページ分析ツールです。キャプチャされた Web ページを迅速に変換するために使用されます。検索、検索、および検索を行うためのいくつかの簡単なメソッドと Python のような構文を提供します。DOM ツリーの後に変換ツリーを変更します対応する中国語の文書もあり、より学習しやすくなっています。


HTML コンテンツ、ローカル HTML ファイル、または URL を含む文字列を使用して beautifulSoup オブジェクトを作成できます。URL の作成プロセスは次のとおりです。

from urllib import request
from bs4 import BeautifulSoup

response = request.urlopen("http://www.baidu.com")
html = response.read()
html = html.decode("utf-8")
soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())  # 格式化输出内容

画像の説明を追加してください

Beautiful Soup は、複雑な HTML ドキュメントを複雑なツリー構造に変換します。各ノードは Python オブジェクトであり、すべてのオブジェクトは次の 4 つのタイプに要約できます。

  • 鬼ごっこ
  • ナビゲート可能な文字列
  • 美しいスープ
  • コメント

タグとはHTMLのラベルのことです

print(soup.title)
print(soup.head)

NavigableString はラベル内のテキストを抽出できます → 非常に簡単で、文字列を使用するだけです

print(soup.title.string)

BeautifulSoup はドキュメントのコンテンツ全体を表します。ほとんどの場合、これは特殊なタグである Tag オブジェクトと見なされます。次のコードは、その型、名前、属性をそれぞれ取得できます。

print(type(soup))
print(soup.name)
print(soup.attrs)

Comment オブジェクトは NavigableString オブジェクトの特殊な種類であり、そのコンテンツにはコメント記号が含まれていないため、適切に扱わないとテキスト プロセッサに予期せぬトラブルを引き起こす可能性があります。


.string に関する注意: ラベルにラベルがない場合、「.string」はラベルの内容を返します。タグ内にタグが 1 つしかない場合、「.string」は最も内側のタグの内容も返します。タグに複数のサブタグ ノードが含まれている場合、.string メソッドでどのサブタグ ノードを呼び出す必要があるかタグを決定できず、「.string」の出力は「None」になります。


収集中に IP がブロックされるのを避けるために、プロキシがよく使用されます。以下は、Dangdang のオンライン書籍情報をクロールし、csv テーブルに書き込むプロセスを示しています。

from bs4 import BeautifulSoup
import requests
import csv


def get_all_books():  # 获取每本书的连接URL
    '''
        获取该页面所有符合要求的图书的连接
    '''
    url = 'http://search.dangdang.com/?key=Python&act=input'
    book_list = []
    r = requests.get(url, timeout=30)
    soup = BeautifulSoup(r.text, 'lxml')

    book_ul = soup.find_all('ul', {
    
    'class': 'bigimg'})
    book_ps = book_ul[0].find_all('p', {
    
    'class': 'name', 'name': 'title'})
    for book_p in book_ps:
        book_a = book_p.find('a')
        book_url = 'http:'+book_a.get('href')  # 对应详细信息的页面链接URL,需要'http:'
        book_title = book_a.get('title')  # 书名
        book_list.append(book_url)

    return book_list


def get_information(book_url):
    '''
        获取每本书籍的信息
    '''
    print(book_url)
    headers = {
    
    
        'User-Agent': 'MMozilla/5.0(Windows NT 6.1; WOW64; rv:31.0) Gecko/20200201 Firefox/31.0'}
    r = requests.get(book_url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    book_info = []

    # 获取书籍名称
    div_name = soup.find('div', {
    
    'class': 'name_info', 'ddt-area': '001'})
    h1 = div_name.find('h1')
    book_name = h1.get('title')
    book_info.append(book_name)

    # 获取书籍作者
    div_author = soup.find('div', {
    
    'class': 'messbox_info'})
    span_author = div_author.find('span', {
    
    'class': 't1', 'dd_name': '作者'})
    book_author = span_author.text.strip()[3:]
    book_info.append(book_author)

    # 获取书籍出版社
    div_press = soup.find('div', {
    
    'class': 'messbox_info'})
    span_press = div_press.find('span', {
    
    'class': 't1', 'dd_name': '出版社'})
    book_press = span_press.text.strip()[4:]
    book_info.append(book_press)

    # 获取书籍价钱
    div_price = soup.find('div', {
    
    'class': 'price_d'})
    book_price = div_price.find('p', {
    
    'id': 'dd-price'}).text.strip()
    book_info.append(book_price)

    return book_info


def main():
    header = ['书籍名称', '作者', '出版社', '当前价钱']
    # 文件操作
    with open('Python_book_info.csv', 'w', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(header)
        books = get_all_books()
        for i, book in enumerate(books):
            if i % 10 == 0:
                print('获取了{}条信息,一共{}条信息'.format(i, len(books)))
            l = get_information(book)
            writer.writerow(l)


if __name__ == '__main__':
    main()


最終的には登山に反対されましたが、この実践が成功していることを示す情報が収集できてうれしく思います

画像の説明を追加してください


画像の説明を追加してください

  夏休みに少しだけ爬虫類の入門をしたり、Xia Agile 著『Python 爬虫類超精緻実践攻略』という本を参考に小さなプロジェクトをいくつか完成させたりしましたが、それでもとても満足しているので、ここで厳選した部分をシェアします。

おすすめ

転載: blog.csdn.net/weixin_47305073/article/details/126732940