Artikelverzeichnis
Vorwort
Mit dem Aufkommen von E-Commerce-Plattformen beginnen immer mehr Menschen, online einzukaufen. Für E-Commerce-Plattformen sind Daten wie Produktinformationen, Preise und Bewertungen sehr wichtig. Daher ist die Erfassung von Daten wie Produktinformationen, Preisen und Bewertungen auf E-Commerce-Plattformen zu einer sehr wertvollen Aufgabe geworden. In diesem Artikel wird erläutert, wie Sie mit Python ein Crawler-Programm schreiben, um Produktinformationen, Preise, Bewertungen und andere Daten von E-Commerce-Plattformen abzurufen.
1. Vorbereitung
Bevor wir mit dem Schreiben des Crawlers beginnen, müssen wir einige Tools und eine Umgebung vorbereiten.
Python3.8
PyCharm
2. Analysieren Sie die Zielwebsite
Bevor wir mit dem Schreiben eines Crawler-Programms beginnen, müssen wir die Struktur und Daten der Zielwebsite analysieren. In diesem Artikel erfassen wir Daten wie Produktinformationen, Preise und Bewertungen von JD.com.
1. Wareninformationen
-
Zu den Produktinformationen des Einkaufszentrums gehören Produktname, Produktnummer, Produktklassifizierung, Produktmarke, Produktmodell, Produktspezifikation, Produktherkunft, Produktgewicht, Produktverpackung und andere Informationen. Diese Informationen finden Sie auf der Produktdetailseite.
-
Preis
Der Warenpreis im Einkaufszentrum umfasst Informationen wie den ursprünglichen Warenpreis, den Warenaktionspreis, den Warenrabatt usw. Diese Informationen finden Sie auf der Produktdetailseite. -
Kommentare
Die Produktbewertungen auf JD.com umfassen Informationen wie Benutzerbewertungen, Benutzerbilder und Benutzer-Folgebewertungen. Diese Informationen finden Sie auf der Produktdetailseite.
3. Schreiben Sie ein Crawler-Programm
Nachdem wir die Struktur und Daten der Zielwebsite analysiert haben, können wir mit dem Schreiben des Crawlers beginnen. In diesem Artikel verwenden wir das Scrapy-Framework, um ein Crawler-Programm zu schreiben und die erfassten Daten in einer MySQL-Datenbank zu speichern.
- Erstellen Sie ein Scrapy-Projekt
Zuerst müssen wir ein Scrapy-Projekt erstellen. Geben Sie in der Befehlszeile den folgenden Befehl ein:
scrapy startproject jingdong
Dadurch wird ein Scrapy-Projekt namens jingdong erstellt.
- Erstellen Sie einen Crawler
Als nächstes müssen wir einen Crawler erstellen. Geben Sie in der Befehlszeile den folgenden Befehl ein:
scrapy genspider jingdong_spider jd.com
Dadurch wird ein Crawler namens jingdong_spider erstellt, der die Website jd.com crawlt.
- Schreiben Sie Crawler-Code
Nachdem wir den Crawler erstellt haben, müssen wir den Crawler-Code schreiben. Im Scrapy-Framework umfasst der Crawler-Code hauptsächlich die folgenden Teile:
(1) Artikel definieren
Item ist ein Konzept im Scrapy-Framework, das zum Definieren der zu crawlenden Datenstruktur verwendet wird. In diesem Artikel müssen wir einen Artikel definieren, um Daten wie Produktinformationen, Preis und Kommentare zu speichern. Fügen Sie in der Datei „items.py“ des Projekts den folgenden Code hinzu:
import scrapy
class JingdongItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
sku = scrapy.Field()
category = scrapy.Field()
brand = scrapy.Field()
model = scrapy.Field()
spec = scrapy.Field()
origin = scrapy.Field()
weight = scrapy.Field()
package = scrapy.Field()
price = scrapy.Field()
promotion_price = scrapy.Field()
discount = scrapy.Field()
comment = scrapy.Field()
image_urls = scrapy.Field()
images = scrapy.Field()
Hier wird ein Artikel namens JingdongItem definiert, einschließlich Produktname, Produktnummer, Produktkategorie, Produktmarke, Produktmodell, Produktspezifikation, Produktherkunft, Produktgewicht, Produktverpackung, Produktpreis, Produktwerbepreis, Produktrabatt, Produktbewertung, Produkt Bild und andere Bereiche.
(2) Schreiben Sie den Crawler-Code.
Öffnen Sie im Spiders-Verzeichnis des Projekts die Datei jingdong_spider.py und fügen Sie den folgenden Code hinzu:
import scrapy
from jingdong.items import JingdongItem
class JingdongSpider(scrapy.Spider):
name = 'jingdong'
allowed_domains = ['jd.com']
start_urls = ['https://www.jd.com/']
def parse(self, response):
# 获取所有分类链接
category_links = response.xpath('//div[@class="category-item"]/div[@class="item-list"]/ul/li/a/@href')
for link in category_links:
yield scrapy.Request(link.extract(), callback=self.parse_category)
def parse_category(self, response):
# 获取所有商品链接
product_links = response.xpath('//div[@class="gl-i-wrap"]/div[@class="p-img"]/a/@href')
for link in product_links:
yield scrapy.Request(link.extract(), callback=self.parse_product)
# 获取下一页链接
next_page_link = response.xpath('//a[@class="pn-next"]/@href')
if next_page_link:
yield scrapy.Request(next_page_link.extract_first(), callback=self.parse_category)
def parse_product(self, response):
item = JingdongItem()
# 获取商品名称
item['name'] = response.xpath('//div[@class="sku-name"]/text()')[0].extract()
# 获取商品编号
item['sku'] = response.xpath('//div[@class="itemInfo-wrap"]/div[@class="clearfix"]/div[@class="sku"]/div[@class="item"]/div[@class="name"]/text()')[0].extract()
# 获取商品分类
category_list = response.xpath('//div[@class="breadcrumb"]/a/text()')
item['category'] = '>'.join(category_list.extract())
# 获取商品品牌
item['brand'] = response.xpath('//div[@class="itemInfo-wrap"]/div[@class="clearfix"]/div[@class="sku-name"]/a/@title')[0].extract()
# 获取商品型号
item['model'] = response.xpath('//div[@class="Ptable"]/div[@class="Ptable-item"]/dl/dt/text()')[0].extract()
# 获取商品规格
spec_list = response.xpath('//div[@class="Ptable"]/div[@class="Ptable-item"]/dl/dd/ul/li/text()')
item['spec'] = ','.join(spec_list.extract())
# 获取商品产地
item['origin'] = response.xpath('//div[@class="Ptable"]/div[@class="Ptable-item"]/dl/dd/text()')[0].extract()
# 获取商品重量
item['weight'] = response.xpath('//div[@class="Ptable"]/div[@class="Ptable-item"]/dl/dd/text()')[1].extract()
# 获取商品包装
item['package'] = response.xpath('//div[@class="Ptable"]/div[@class="Ptable-item"]/dl/dd/text()')[2].extract()
# 获取商品价格
price_list = response.xpath('//div[@class="summary-price-wrap"]/div[@class="summary-price J-summary-price"]/div[@class="dd"]/span/text()')
item['price'] = price_list[0].extract()
item['promotion_price'] = price_list[1].extract() if len(price_list) > 1 else ''
item['discount'] = response.xpath('//div[@class="summary-price-wrap"]/div[@class="summary-price J-summary-price"]/div[@class="dd"]/div[@class="promo"]/span/text()')[0].extract()
# 获取商品评论
comment_list = response.xpath('//div[@class="comment-item"]')
comment_text_list = []
for comment in comment_list:
comment_text = comment.xpath('div[@class="comment-column J-comment-column"]/div[@class="comment-con"]/div[@class="comment-con-top"]/div[@class="comment-con-txt"]/text()').extract_first()
if comment_text:
comment_text_list.append(comment_text.strip())
item['comment'] = '\n'.join(comment_text_list)
# 获取商品图片
item['image_urls'] = response.xpath('//div[@class="spec-items"]/ul/li/img/@src')
item['images'] = []
yield item
Hier wird ein Crawler namens JingdongSpider definiert. Zuerst ruft er alle Kategorielinks ab, besucht dann nacheinander jede Kategorieseite, ruft alle Produktlinks ab und besucht dann nacheinander jede Produktseite, greift nach Produktinformationen, Preisen, Bewertungen und anderen Daten usw speichert es. unter Artikel.
(3) Konfigurationsdatenbank
Fügen Sie in der Datei „settings.py“ des Projekts den folgenden Code hinzu:
ITEM_PIPELINES = {
'jingdong.pipelines.JingdongPipeline': 300,
}
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWORD = '123456'
MYSQL_DBNAME = 'jingdong'
Hier wird eine Pipeline namens JingdongPipeline definiert, die zum Speichern der erfassten Daten in der MySQL-Datenbank verwendet wird. Gleichzeitig werden die Verbindungsinformationen der MySQL-Datenbank konfiguriert.
(4) Pipeline-Code schreiben
Fügen Sie in der Datei „pipelines.py“ des Projekts den folgenden Code hinzu:
import pymysql
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
from jingdong.items import JingdongItem
class JingdongPipeline(object):
def __init__(self, host, port, user, password, dbname):
self.host = host
self.port = port
self.user = user
self.password = password
self.dbname = dbname
@classmethod
def from_crawler(cls, crawler):
return cls(
host=crawler.settings.get('MYSQL_HOST'),
port=crawler.settings.get('MYSQL_PORT'),
user=crawler.settings.get('MYSQL_USER'),
password=crawler.settings.get('MYSQL_PASSWORD'),
dbname=crawler.settings.get('MYSQL_DBNAME')
)
def open_spider(self, spider):
self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, password=self.password, db=self.dbname, charset='utf8')
self.cursor = self.conn.cursor()
def close_spider(self, spider):
self.conn.close()
def process_item(self, item, spider):
if not isinstance(item, JingdongItem):
return item
# 保存商品信息
sql = 'INSERT INTO product(name, sku, category, brand, model, spec, origin, weight, package, price, promotion_price, discount, comment) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
self.cursor.execute(sql, (item['name'], item['sku'], item['category'], item['brand'], item['model'], item['spec'], item['origin'], item['weight'], item['package'], item['price'], item['promotion_price'], item['discount'], item['comment']))
product_id = self.cursor.lastrowid
# 保存商品图片
if item['image_urls']:
for image_url in item['image_urls']:
self.cursor.execute('INSERT INTO image(product_id, url) VALUES(%s, %s)', (product_id, image_url))
self.conn.commit()
return item
Hier wird eine Pipeline namens JingdongPipeline definiert, die zum Speichern der erfassten Daten in der MySQL-Datenbank verwendet wird. Speichern Sie in der Methode „process_item“ zunächst die Produktinformationen in der Produkttabelle und dann das Produktbild in der Bildtabelle.
(5) Bilddownload konfigurieren
Fügen Sie in der Datei „settings.py“ des Projekts den folgenden Code hinzu:
ITEM_PIPELINES = {
'jingdong.pipelines.JingdongPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = 'images'
Hier werden die Pipeline und der Speicherpfad für den Image-Download konfiguriert.
(6) Führen Sie den Crawler aus
Geben Sie in der Befehlszeile den folgenden Befehl ein, um den Crawler auszuführen:
scrapy crawl jingdong
Dadurch wird das Crawler-Programm gestartet und beginnt, Daten wie Produktinformationen, Preise, Bewertungen usw. von Jingdong Mall zu erfassen und in der MySQL-Datenbank zu speichern.
V. Zusammenfassung
In diesem Artikel wird erläutert, wie Sie mit Python ein Crawler-Programm schreiben, um Produktinformationen, Preise, Kommentare und andere Daten von E-Commerce-Plattformen abzurufen. Durch das Studium dieses Artikels können Sie die grundlegende Verwendung des Scrapy-Frameworks verstehen und erfahren, wie die erfassten Daten in der MySQL-Datenbank gespeichert werden. Gleichzeitig erfahren Sie, wie Sie das Verhalten des Browsers simulieren und die Daten dynamischer Seiten erfassen. Ich hoffe, dieser Artikel hilft Ihnen.