以前写的第一份爬取淘宝信息,当时觉得还可以,完全就是一个面向流程的写法。。。现在看来,这是什么鬼。。。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from lxml import etree
driver = webdriver.Chrome()
driver.get('https://www.taobao.com')
driver.find_element_by_xpath('//input[@id="q"]').send_keys('Python', Keys.ENTER)
html = driver.page_source
html = etree.HTML(html)
images = html.xpath('//img[@class="J_ItemPic img"]/@data-src')
prices = html.xpath('//div[@class="items"]//strong/text()')
deals = html.xpath('//*[@class="deal-cnt"]/text()')
shops = html.xpath('//*[@class="shopname J_MouseEneterLeave J_ShopInfo"][1]/span[2]/text()')
locations = html.xpath('//div[@class="location"]/text()')
for i in range(len(images)):
items = html.xpath('//*[@class="J_ClickStat"]')[i]
temp = {
'title': items.xpath('string(.)').strip(),
'image': images[i],
'price': prices[i],
'deal': deals[i],
'shop': shops[i],
'location': locations[i],
}
print(temp)
对于标题title部分,使用 //*[@class="J_ClickStat"] 定位的是48个元素, 但是直接使用/text()获取其文本内容会得到200多个
在这里采用一种迂回的方法
items = html.xpath('//*[@class="J_ClickStat"]')[i]
items.xpath('string(.)').strip()
先获取当前节点,然后使用 string() 获取当前节点的所有文本信息,再使用 strip() 函数去掉所有的空格换行符等