网页信息抓取软件(一下每项信息应该如何提取?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出现了。. .
这个类似的分析是基于数据挖掘的,希望你能从这个内容中学到一些东西。