网页信息抓取软件(一下每项信息应该如何提取?class属性为哪般? )

优采云 发布时间: 2022-02-14 13:20

  网页信息抓取软件(一下每项信息应该如何提取?class属性为哪般?

)

  通过昨天的分析,我们已经能够依次打开多个页面,接下来就是获取每个页面的宝贝信息了。

  分析页面宝贝信息

  【插入图片,宝贝信息的各种内容】

  

  从图片来看,每个宝贝都有以下信息:价格、标题、url、交易金额、店铺、位置等6条信息,其中url代表宝贝的地址。

  通过viewer分析,每个baby都在一个div中,这个div的class属性收录item。

  并且所有的item都在一个div中,总div有items的class属性,也就是一个页​​面收录所有宝物的frame。

  所以,只有当div已经加载完毕,才能断定可以提取页面的baby信息,所以在提取信息之前,我们要判断这个div的存在。

  对于网页源码的解析,这次我们使用Pyquery,依次使用。感觉PyQuery比较好用,尤其是pyquery搜索到的对象都可以在这里搜索到,非常方便。

  请参阅我之前的 文章 了解如何使用 Pyquery,或查看 API。

  下面我们依次分析每条信息应该如何提取。

  1、价格

  【插图、价格】

  

  可以看到价格信息在一个div中,并且有class属性price。如果我们通过文字得到,也会得到它前面的RMB符号,我们回去切片的时候可以把它剪掉。

  2、成交金额

  【插图,金额】

  

  音量信息在另一个div标签中,class属性为deal-cnt,最后三个字符还是需要剪掉的。

  3、标题

  [插入图片,标题]

  

  宝贝的title在一个div标签中,class属性为title,可以通过text获取。

  4、商店

  

  [插入图片、店铺和位置]

  店铺名称在一个 div 标签中,其 class 属性为 shop。

  5、位置

  如上所示,类属性为位置。

  6、网址

  【插入图片,宝贝地址】

  

  url地址在一个a标签里,class属性是pic-link,这个a标签的href属性就是url地址。

  from pyquery import PyQuery as pq

def get_products():

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))

html=browser.page_source

doc=pq(html)

items=doc('div.item').items()#讲解一下

for item in items:

product={

'url':item('a.pic-link').attr('href'),

'price':item.find('.price').text()[1:],

'amount':item.find('.deal-cnt').text()[:-3],

'title':item.find('.title').text(),

'shop':item.find('.shop').text(),

'location':item.find('.location').text()

}

print(product)

#save_to_mongo(product)

save_to_csv(product)

  这里说的是item的内容,看一下源码中的例子:

  > d = PyQuery('foobar')

> [i.text() for i in d.items('span')]

['foo', 'bar']

>[i.text() for i in d('span').items()]

['foo', 'bar']

>list(d.items('a')) == list(d('a').items())

True

  将数据保存到 MongoDb

  如果我们拿到产品,想把它保存到MongoDb数据库中,其实很简单。设置数据库的url、数据库名、表名,通过pymongo链接到对应的数据库。

  即使我们的数据库还没有建立,也没关系,表和数据会动态创建。

  import pymongo

'''MONGO设置'''

MONGO_URL='localhost'

MONGO_DB='taobao'

MONGO_Table=KEYWORD

client=pymongo.MongoClient(MONGO_URL)

db=client[MONGO_DB]

def save_to_mongo(product):

try:

if db[MONGO_Table].insert(product):

print('保存成功',product)

except Exception:

print('保存出错',product)

pass

  【插图,MongoDB数据】

  

  将数据保存到 CSV 文件

  其实也是一个文本文件,但是可以通过excel打开,方便我们做一些分析。

  我这里就不赘述了,看代码就行了。

  def save_to_csv(product):

with open(FileName,'a') as f:

s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'

try:

f.write(s)

print('保存到csv成功!',product)

except:

pass

  所有代码

  只要更改KEYWORD关键字的内容,就可以搜索到不同的宝贝信息并保存。我们默认将其保存为 csv 文件。毕竟数据只有几千条,Excel方便。

  from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.common.exceptions import TimeoutException

from pyquery import PyQuery as pq

import re

import pymongo

from multiprocessing import Pool

'''要搜索的关键字'''

KEYWORD='Iphone8'

'''MONGO设置'''

MONGO_URL='localhost'

MONGO_DB='taobao'

MONGO_Table=KEYWORD

'''要保存的csv文件'''

FileName=KEYWORD+'.csv'

'''PhantomJS参数'''

SERVICE_ARGS=['--load-images=false']#不加载图片,节省时间

client=pymongo.MongoClient(MONGO_URL)

db=client[MONGO_DB]

#browser=webdriver.Firefox()

browser=webdriver.PhantomJS(service_args=SERVICE_ARGS)

browser.set_window_size(1400,900)

index_url='https://www.taobao.com/'

wait=WebDriverWait(browser, 10)

def search(keyword):

try:

browser.get(index_url)

#user_search_input=browser.find_element_by_css_selector('#q')

#user_search_button=browser.find_element_by_css_selector('.btn-search')

user_search_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))

user_search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search")))

user_search_input.send_keys(keyword)

user_search_button.click()

total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.total')))

total_page=re.compile(r'(\d+)').search(total.text).group(1)

print(total_page)

get_products()

return int(total_page)

except TimeoutException:

search(keyword)

def get_next_page(pageNum):

try:

user_page_input = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/input")))

user_page_button = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/span[3]")))

user_page_input.clear()

user_page_input.send_keys(pageNum)

user_page_button.click()

wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'li.active > span:nth-child(1)'),str(pageNum)))

get_products()

except TimeoutException:

get_next_page(pageNum)

def get_products():

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))

html=browser.page_source

doc=pq(html)

items=doc('div.item').items()

for item in items:

product={

'url':item('a.pic-link').attr('href'),

'price':item.find('.price').text()[1:],

'amount':item.find('.deal-cnt').text()[:-3],

'title':item.find('.title').text(),

'shop':item.find('.shop').text(),

'location':item.find('.location').text()

}

print(product)

#save_to_mongo(product)

save_to_csv(product)

def save_to_csv(product):

with open(FileName,'a') as f:

s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'

try:

f.write(s)

print('保存到csv成功!',product)

except:

pass

def save_to_mongo(product):

try:

if db[MONGO_Table].insert(product):

print('保存成功',product)

except Exception:

print('保存出错',product)

pass

def main():

total=search(KEYWORD)

# p=Pool()

# p.map(get_next_page,[i for i in range(2,total+1)])

for i in range(2,total+1):

get_next_page(i)

browser.close()

if __name__=='__main__':

main()

  简单分析结果

  【插入图片,结果分析示例】

  

  月交易量最好的是一部老人手机,仅79元。. . .

  在智能手机中,vivo X20是最畅销的,售价2999元。

  1500的价格,小米5x出现了。. .

  这个类似的分析是基于数据挖掘的,希望你能从这个内容中学到一些东西。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线