スクレイピーはDoubantop250をクロールし、MySQLデータベースに挿入します(エントリーレベル)
- pythonをローカルにインストールし、公式Webサイトにアクセスして必要なバージョンをダウンロードし、コマンドラインからpythonと入力して、インストール後に確認します。
C:\Users\jrkj-kaifa08\PycharmProjects\fzreport>python
Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 08:53:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
上記のシナリオが表示された場合、インストールは成功しています。
- スクレイプフレームワークをローカル環境にインストールするには、コマンドラインにpip install scarpと入力します。インストール後、スクレイプと入力して次のことを確認できます。
C:\Users\jrkj-kaifa08\PycharmProjects\fzreport>scrapy
Scrapy 2.2.0 - project: fzreport
Usage:
scrapy <command> [options] [args]
Available commands:
bench Run quick benchmark test
check Check spider contracts
commands
crawl Run a spider
edit Edit spider
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list List available spiders
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
Use "scrapy <command> -h" to see more info about a command
上記のシナリオが表示された場合、インストールは成功しています。
-
この実験では、コードはPyCharmで記述されています。公式ウェブサイトにアクセスして、コミュニティバージョンをダウンロードすることもできます。これは無料で、誰にでもできるインストールです。
-
次にトピックを入力し、プロジェクトの作成を開始します。
(1)pythonプロジェクトを保存するフォルダーをコンピューター上でローカルに見つけ、上記のパスでcmdを実行し、Enterキーを押します。
これにより、コマンドラインが開き、コマンドラインにscrapy startproject DoubanMovieと入力します(DoubanMovieというプロジェクトを作成します)。
d:\>scrapy startproject DoubanMovie
New Scrapy project 'DoubanMovie', using template directory 'c:\users\jrkj-kaifa08\appdata\local\programs\python\python37\lib\site-packages\scrapy\templates\project', created in:
d:\DoubanMovie
You can start your first spider with:
cd DoubanMovie
scrapy genspider example example.com
次に、cd DoubanMovieを実行します(ここでは、Linuxのようにタブキーを使用して完了できます)
プロジェクトフォルダに入った後、scrapy genspider douban movie.douban.comを実行します(movie.douban.comに基づいてWebクローラーを作成します)
d:\>cd DoubanMovie
d:\DoubanMovie>scrapy genspider douban movie.douban.com
Created spider 'douban' using template 'basic' in module:
DoubanMovie.spiders.douban
(2)作成したプロジェクトをPyCharmで開くと、次の構造が表示されます。
最初に構成ファイルsetting.pyを変更します
ROBOTSTXT_OBEY = False
元のTrueをFalseに変更します(クローラープロトコルに準拠するかどうかに関係なく、学習フェーズでFalseに変更する必要があります)
ITEM_PIPELINES = {
'DoubanMovie.pipelines.Dou': 300,
}
また、このコードのコメントを開きます。ここの値が小さいほど、速度が速くなります。
(3)次にDoubanMovieを開きます
もう一度F12キーを押すと、すべての映画情報が<olclass = "grid_view">タグに含まれていることがわかります。
これは単なるテストであるため、映画名、評価、人数の4つのフィールドのみを取得します。
各映画の情報がliタグに含まれていることがわかります。したがって、そのxpathパスは次のようになります。
'//ol[@class="grid_view"]/li'
ランキング情報はemタグにあり、そのxpathは
'.//div[@class="pic"]/em/text()'
映画名情報はタグの下の最初のスパンにあり、そのxpathは
'.//div[@class="hd"]/a/span[1]/text()'
映画の評価情報は、div class = starタグの下のspanclass = "rating_num"にあり、そのxpathは
'.//div[@class="star"]/span[@class="rating_num"]/text()'
映画の評価数に関する情報は、div class = starタグの下のスパンにあり、そのxpathは
'.//div[@class="star"]/span/text()'
次に、items.pyの作成を開始できます
import scrapy
class DouItem(scrapy.Item):
# define the fields for your item here like:
# 排名
ranking = scrapy.Field()
# 电影名称
movie_name = scrapy.Field()
# 评分
score = scrapy.Field()
# 评论人数
score_num = scrapy.Field()
pass
この場所を自分で理解すると、javaのboクラスに似ている可能性があります。items.pyファイルを開くと、上記の例が表示されます。例に従ってください。
その後はハイライトdouban.pyです
# -*- coding: utf-8 -*-
import scrapy
from DoubanMovie.items import DouItem
class DouSpider(scrapy.Spider):
name = 'douban'
# allowed_domains = ['movie.douban.com']
def start_requests(self):
start_urls = 'https://movie.douban.com/top250'
yield scrapy.Request(start_urls)
def parse(self, response):
item = DouItem()
movies = response.xpath('//ol[@class="grid_view"]/li')
for movie in movies:
item['ranking'] = movie.xpath('.//div[@class="pic"]/em/text()').extract()[0]
item['movie_name'] = movie.xpath('.//div[@class="hd"]/a/span[1]/text()').extract()[0]
item['score'] = movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract()[0]
item['score_num'] = movie.xpath('.//div[@class="star"]/span/text()').re(r'(\d+)人评价')[0] # Selector也有一种.re()
print(item['movie_name'], "------------------------")
yield item
next_url = response.xpath('//span[@class="next"]/a/@href').extract()
if next_url:
next_url = 'https://movie.douban.com/top250' + next_url[0]
yield scrapy.Request(next_url)
次に、データベースに接続するためのpipelines.pyがあります。
ここでは、pymysqlコンポーネントをダウンロードして、コマンドラインで実行する必要があります。
pip install pymysql
次に、mysqlデータベースを開くためのテーブルを作成する必要があります。テストのため、次のステートメントを入力して、すべてのデータタイプをvarcharに設定します。
create table movieTable(
ranking varchar(5),
movie_name varchar(100),
score varchar(10),
score_num varchar(10)
)
次はpipelines.pyのコードです
import pymysql
import pymysql.cursors
class Dou(object):
def __init__(self):
# 连接MySQL数据库
self.connect = pymysql.connect(host='localhost', user='zds', password='zds', db='zds', port=3306)
self.cursor = self.connect.cursor()
print("______________数据库连接已建立")
def process_item(self, item, Spider):
# 往数据库里面写入数据
print("--------------正在插入数据")
self.cursor.execute(
'insert into movieTable(ranking,movie_name,score,score_num)VALUES ("{}","{}","{}","{}")'.format(item['ranking'], item['movie_name'], item['score'], item['score_num']))
self.connect.commit()
return item
# 关闭数据库
def close_spider(self, Spider):
print("============正在关闭数据库连接")
self.cursor.close()
self.connect.close()
すべてのコードを記述して保存したら、コマンドラインで実行できます。
C:\Users\jrkj-kaifa08\PycharmProjects\DoubanMovie>scrapy crawl douban
エラーなしで実行が完了したら、データベースに移動してデータを確認し、データが挿入されていることを確認します。
データをファイルに保存する場合は、コマンドラインで実行できます。
C:\Users\jrkj-kaifa08\PycharmProjects\DoubanMovie>scrapy crawl douban douban.csv
この場合、データは現在のパスの下のdouban.csvファイルに保存されます。