Pythonクローラーコンバット2:トップ250クロールを読むDouban

序文

この記事では主に、Top250を読み取るDoubanのデータクロールとデータ前処理を紹介します。使用される主なライブラリは、re、request、Beautifulsoup、lxmlです。この記事では、クロール中に遭遇したピットのいくつかと、これらのピットへの私のアプローチについて要約します。クロール用のコードとデータは、記事の最後に添付されています。これが私の最初の実際のクローラーです。Doubanムービーtop250の姉妹バージョンです。

爬虫類

ダウンロードリンク機能を定義する

Webページをダウンロードするときに、エラーが頻繁に報告されます。不要なエラーを減らすために、ダウンロード時には次の3つの点に注意することができます。

  1. 各ダウンロードの間に一時停止します。そうしないと、ブロックされる可能性があります
  2. ヘッダーを追加し、クローラーではないふりをします。しかし、ヘッダーの内容は無料のようです
  3. エンコードを追加し、decode = 'utf-8'を追加します。そうしないと、クロールされたコンテンツが文字化けする可能性があります。
# 引入库
import re
import pandas as pd
import time
import urllib.request
from lxml.html import fromstring
from bs4 import BeautifulSoup
# 下载链接
def download(url):
    print('Downloading:', url)
    request = urllib.request.Request(url)
    request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36') #进行伪装
    resp = urllib.request.urlopen(request)
    html = resp.read().decode('utf-8') #utf-8编码
    time.sleep(3)   #间隔3s,防止被封禁
    return html

コンテンツの選択

Douban Moviesをクロールするときに使用した方法は、各インデックスページをダウンロードしてから、各インデックスページのすべての映画コンテンツをダウンロードすることでした。合計10のインデックスページがあり、各ページには25の映画情報があるため、25 * 10 + 10 = 260のWebサイトをダウンロードする必要があります。これによりクロール情報が少し増える可能性がありますが、明らかな欠点の1つは、時間がかかることです。
コンテンツのクロール

Doubanをクロールして本を読んだとき、私が使用した方法は、各索引ページをダウンロードし、索引ページ(タイトルの下)にある本の情報を直接抽出することでした。ダウンロードする必要があるのは10ページだけです。また、昔のクロールドゥーバンムービーやクロールドゥーバンの方法で本を読んでいると、作者の情報を見つけるのが大変でしたこれにより、コンテンツを柔軟にクロールする方法を選択できるようになります。
コンテンツのクロール

位置決め方法の選択

最初のDoubanムービーでは、クローラーの配置に3つの方法があります。

  1. 正規表現によるターゲティング
  2. Beautifulsoupの検索機能で検索
  3. lxmlでXpathを検索

それでは、どの方法を使用すべきですか?私の原則は:シンプルが最高です。
私は個人的にXpathをお勧めします。これは最も簡単で簡単なので、F12を押してクロールするコンテンツを選択し、xpathを右クリックしてコピーします。次に、Beautifulsoupの検索機能を使用して検索することができます。これは最後の手段よりも少ない方法です。正規表現を使用しないようにしてください。
たとえば、xpathポジショニング方式は本のタイトルを読むときに使用されますが、ここで注意すべき点が2つあります。

  1. / tbodyを xpathから削除する必要があります
  2. .strip()を使用して改行とスペース削除する必要がある

xpath

# 待爬取内容
name = []
rate = []
info = []


# 循环爬取每页内容
for k in range(10):
    url = download('https://book.douban.com/top250?start={}'.format(k*25))
    tree = fromstring(url)
    soup = BeautifulSoup(url)
    #找出该页所有书籍信息
    for k in range(25):
        name.append(tree.xpath('//*[@id="content"]/div/div[1]/div/table[{}]/tr/td[2]/div[1]/a/text()'.format(k+1))[0].strip())
        rate.append(soup.find_all('span',{
    
    'class':'rating_nums'})[k].get_text())
        info.append(soup.find_all('p',{
    
    'class':'pl'})[k].get_text())
# 拼接
book_data = pd.concat([name_pd, rate_pd, info_pd], axis=1)
book_data.columns=['书名', '评分', '信息']
book_data.head()

データの前処理

次に、上記で読み取ったデータを前処理します。

  1. 変数情報作家、出版社、発行年、価格設定
  2. 手動で調整する必要がある2つの異常なデータがあります
  3. 抽出され正規表現は年に発行されデジタルセクションの価格設定
  4. ブリッジの書き込み、情報変数の削除

ことを注意著者、出版社は、出版年、価格は場所によってインデックスを見つけることですが、データを手動で調整する必要がある2つの例外があります。
ホームズ
聖書

具体的なコードは次のとおりです。

# 数据预处理:

# 将信息分割
Info = book_data['信息'].apply(lambda x: x.split('/'))

# 提取信息
book_data['作家'] = Info.apply(lambda x: x[0])
book_data['出版社'] = Info.apply(lambda x: x[-3])
book_data['出版年'] = Info.apply(lambda x: x[-2])
book_data['定价'] = Info.apply(lambda x: x[-1])

# 手动调整
book_data.iloc[9,4] = '群众出版社'
book_data.iloc[9,5] = '1981'
book_data.iloc[184,5] = '1996'
book_data.iloc[184,6] = '0'

#提取年份
f = lambda x: re.search('[0-9]{4,4}', x).group()
book_data['出版年'] = book_data['出版年'].apply(f)

#提取定价
g = lambda x: re.search('([0-9]+\.[0-9]+|[0-9]+)', x).group()
book_data['定价'] = book_data['定价'].apply(g)

book_data = book_data.drop(['信息'], axis =1)

# 输出
outputpath='c:/Users/zxw/Desktop/修身/与自己/数据分析/数据分析/爬虫/豆瓣读书/book.csv' ## 路径需要自己改!
book_data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')

追記

予備的な理解と見なさ爬虫類への本自分では、次の学習検討するかもしれない機械学習から始めて、コンテンツをR用と統計的学習への入門、それからの書き込み

コードとデータセット(抽出コード:disq)

おすすめ

転載: blog.csdn.net/weixin_43084570/article/details/108666114