python京東商品情報を這い出す
5720 ワード
本稿ではpython爬虫類を用いて,京東の商品情報を収集する.京東の検索ページは二次ロード技術を採用しているため、ロード時に30件の商品情報しかロードされず、残りの30件はドロップダウンページを最後までロードする必要がある.そこで,商品情報を完全に取得するために,プロセスプール,selenium+phantomjsを組み合わせて京東の検索ページを取得し,lxmlモジュールを用いて必要な商品詳細を取得し,取得したデータをmysqlデータベースに格納する.
ツールおよび使用モジュール
python 2.7バージョン、pycharmエディタを使用して開発します.関連モジュールにはseleniumlxmlなどがあります
二開発前の確保
1システムにpython 2がインストールされています.7バージョン、pycharmエディタ
2システムはseleniumモジュール、phantomjsをインストールしました
三mysqlライブラリの作成
1データベース名jdの作成
create database jd;
2ライブラリにgoodsデータテーブルを作成し、データを格納します.フィールドにはid/タイトル/価格/コメント数/商品リンク/店舗名/店舗リンクがあります.これらのフィールドも私たち爬虫類が捕まえる必要がある情報です.
use jd;
create table goods( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, price VARCHAR(20) NOT NULL, comment VARCHAR(20) , link VARCHAR(300) NOT NULL, shop_name VARCHAR(100) NOT NULL, shop_link VARCHAR(100) );
四コードと注釈
ツールおよび使用モジュール
python 2.7バージョン、pycharmエディタを使用して開発します.関連モジュールにはseleniumlxmlなどがあります
二開発前の確保
1システムにpython 2がインストールされています.7バージョン、pycharmエディタ
2システムはseleniumモジュール、phantomjsをインストールしました
三mysqlライブラリの作成
1データベース名jdの作成
create database jd;
2ライブラリにgoodsデータテーブルを作成し、データを格納します.フィールドにはid/タイトル/価格/コメント数/商品リンク/店舗名/店舗リンクがあります.これらのフィールドも私たち爬虫類が捕まえる必要がある情報です.
use jd;
create table goods( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, price VARCHAR(20) NOT NULL, comment VARCHAR(20) , link VARCHAR(300) NOT NULL, shop_name VARCHAR(100) NOT NULL, shop_link VARCHAR(100) );
四コードと注釈
# -*- coding: utf-8 -*-
__author__ = 'EasouChen'
#
# selenium phantomjs
from selenium import webdriver
import time
from lxml import etree
#
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import pymysql
# ,
from multiprocessing import Pool
# url
from urllib import quote
# mysql ascii decode , default 'utf-8'
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
# ,
def get_goods(key,page_num):
'''
' , , , , , , '
:param key: ,
:param page_num:
:return:
'''
#
conn = pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='jd',use_unicode=True, charset="utf8")
# userAgent,
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap['phantomjs.page.settings.userAgent'] = ("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0")
driver = webdriver.PhantomJS(desired_capabilities=dcap)
# url , phantomjs url ??,
# %E9%9B%B6%E9%A3%9F , urllib
driver.get('https://search.jd.com/Search?keyword=%s&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&suggest=1.his.0.0'%(key)+'&page=%s&s=57&click=0'%(page_num*2-1))
# , , ,
js = "window.scrollTo(0,document.body.scrollHeight);"
time.sleep(2)
driver.execute_script(js)
time.sleep(4)
# , lxml
htmls = etree.HTML(driver.page_source)
#
goods_list = htmls.xpath("//div [@id='J_goodsList']/ul/li")
count = 1
for item in goods_list:
# ,
try:
title1 = item.xpath("./div/div[contains(@class,'p-name')]/a/em")[0]
title = title1.xpath("string(.)")
print title
title = title.replace('(','')
price = item.xpath("./div/div[@class='p-price']/strong/i/text()")
comment = item.xpath("./div/div[@class='p-commit']/strong/a/text()")
link = "https:"+item.xpath("./div/div[@class='p-img']/a/@href")[0]
shop_name = item.xpath("./div/div[@class='p-shop']//a/text()")
if shop_name:
shop_link = "http:"+item.xpath("./div/div[@class='p-shop']//a/@href")[0]
else:
shop_name = [' ']
print('
'+str(count)+':')
print("-------------------------------------------------------")
# print title
# print price[0]
# print comment[0]
# print link
# print shop_name[0]
# print shop_link
#
serch_str = "select * from goods where link='%s';" %link
ser_result = conn.query(serch_str)
#
if not ser_result:
print(' ')
if shop_name:
save_str = "insert into goods(title,price,comment,link,shop_name,shop_link) values('" + title + "','" + price[0] + "','" + comment[0] + "','" + link + "','" + shop_name[0] + "','" + shop_link + "');"
else:
save_str = "insert into goods(title,price,comment,link,shop_name,shop_link) values('" + title + "','" + \
price[0] + "','" + comment[0] + "','" + link + "','" +" " + "','" + "" + "');"
save_result = conn.query(save_str)
conn.commit()
print(title,' ')
else:
print(" ")
print('-------------------------------------------------------')
count +=1
except Exception as e:
print(e)
# , , phantomjs
conn.close()
driver.close()
driver.quit()
print(' '+str(page_num)+' ',' '+str(count)+' ')
#
if __name__ == '__main__':
# , url
key = quote(' ')
# , 4
po_li = Pool(4)
#
for x in xrange(1,2):
print(' ' + str(x) + ' ')
t = po_li.apply_async(get_goods,(key,x,))
#
po_li.close()
po_li.join()