文章目录
- 1.只读取第一页1.1准备工作1.2.定位1.3.获取商品信息1.4. 整体代码1.5.输出结果展示1.6改进,存储在CSV文件内并分行存储2.读取多页商品信息2.1部分问题2.2代码2.3结果展示
私信小编01即可获取Python学习资料
在学习本节时,发现在淘宝页面搜索需要登录账号密码,因此就选择天猫网页进行爬取,但是只能爬取第一页,之后的页面也要登录账号。(京东页面搜索下一页不要登录账号,有时间做一个爬取京东页面商品信息)
1.只读取第一页
1.1准备工作
天猫搜索页面的URL,以及关键字
https://list.tmall.com/search_product.htm?q=
q后面就是我们需要搜索的商品名称,可以使用quote函数输入keyword,也可以使用send_keys传入到输入框,本文使用第二种方法.
url='https://list.tmall.com/search_product.htm?q='+quote(keyword)
send_keys(keyword)
1.2.定位
1. 首先定位输入框
2.定位搜索按键
?
3.代码定位
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
input.clear()
input.send_keys(keyword)
submit.click()
使用input定位到输入框,然后使用input.send_keys传入搜索关键字。
使用submit定位搜索按键,输入关键字之点击搜索,搜索出商品信息。
1.3.获取商品信息
我们使用pyquery来遍历商品信息,获取商品图片,商品具体名称,商品价格,商品详细界面,商品销售额。
items=doc('div .product').items()
for item in items:
product={
'image':item.find('div div a img').attr('src'),
'name':item.find('.productTitle a').text(),
'price':item.find('.productPrice em').text(),
'detail':item.find('div div a').attr('href'),
'shop':item.find('.productShop a').text(),
'sales':item.find('.productStatus span em').text()
}
1.4. 整体代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'
def index_page(page):
url='https://list.tmall.com/search_product.htm?q='
brower.get(url)
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
input.clear()
input.send_keys(keyword)
submit.click()
return get_products(brower)
def get_products(brower):
html=brower.page_source
doc=pq(html)
items=doc('div .product').items()
for item in items:
product={
'image':item.find('div div a img').attr('src'),
'name':item.find('.productTitle a').text(),
'price':item.find('.productPrice em').text(),
'detail':item.find('div div a').attr('href'),
'shop':item.find('.productShop a').text(),
'sales':item.find('.productStatus span em').text()
}
print(product)
yield product
def saveinformation(infors):
with open('data.csv','w',encoding='utf-8') as f:
writer=csv.writer(f)
writer.writerow(infors)
if __name__=='__main__':
result=index_page(1)
saveinformation(result)
因为天猫界面只能爬取第一页信息,其他页需要登录才能查看,因此本文传入page=1.
我们将读取信息写入csv文件中,但是输出是整行输入,不能分行输入,还在寻找原因。
1.5.输出结果展示
{'image': '//img.alicdn.com/bao/uploaded/i2/2838892713/O1CN01KmhxMx1Vub9Om1ix8_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 Pro|5G SoC芯片超感知徕卡
四摄华为p40pro 5g华为手机华为官方旗舰店', 'price': '?6488.00', 'detail': '//detail.tmall.com/item.htm?id=613832405367&skuId=4501042263809&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1.7万笔'}
{'image': '//img.alicdn.com/bao/uploaded/i3/2616970884/O1CN01E4dXaU1IOukPBOKrb_!!2616970884.jpg', 'name': '【9.25号享12期免息】华为/HUAWEI P40Pro|5G SoC芯片手机徕卡
四摄50倍变焦曲面屏官方旗舰店正品华为p40pro', 'price': '?6488.00', 'detail': '//detail.tmall.com/item.htm?id=614820399492&skuId=4326362936208&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '4599笔'}
{'image': '//img.alicdn.com/bao/uploaded/i1/2838892713/O1CN01ASqM6R1Vub9Lua8E8_!!2838892713.jpg', 'name': '华为/HUAWEI MateBook D14Windows版 英特尔10代 i5+8GB/16GB+512GB SSD 独显 笔记本电脑', 'price': '?4999.00', 'detail': '//detail.tmall.com/item.htm?id=610840455173&skuId=4463626930382&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '4069笔'}
{'image': '//img.alicdn.com/bao/uploaded/i2/2838892713/O1CN01TjohBN1Vub9MbcSCc_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 | 5GSoC芯片超感知徕卡三
摄华为p40 5g智能手机华为手机华为官方旗舰店', 'price': '?4488.00', 'detail': '//detail.tmall.com/item.htm?id=613832301513&skuId=4497703782091&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '2.0万笔'}
{'image': '//img.alicdn.com/bao/uploaded/i1/2838892713/O1CN01ltNfaA1Vub9Rrkxd3_!!2838892713.jpg', 'name': '【限时享12期免息+200优惠券】Huawei/华为Mate30 Pro5G芯片四
摄mate30pro 5g手机华为手机华为官方旗舰店', 'price': '?6399.00', 'detail': '//detail.tmall.com/item.htm?id=606307762219&skuId=4309474780744&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '8139笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为 HUAWEI MatePad Pro平板电脑 轻薄全面屏办公学习娱
乐智能平板', 'price': '?3299.00', 'detail': '//detail.tmall.com/item.htm?id=607884046949&skuId=4265065828223&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '5435笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '华为/HUAWEI MateBook 14 2020款英特尔十代i7+16GB+512GB SSD+MX350 独显触控屏笔记本电脑', 'price': '?7399.00', 'detail': '//detail.tmall.com/item.htm?id=611563243161&skuId=4535895359432&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1404笔'}
em.htm?id=606241138896&skuId=4447336816956&user_id=268451883&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '三际数码官方旗舰店', 'sales': '400笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【官方正品】华为平板M6 8.4英寸 影音游戏娱乐 WiFi/4G可通话平
板电脑 高性能新品 苏宁官方旗舰店', 'price': '?2199.00', 'detail': '//detail.tmall.com/item.htm?id=597644950589&skuId=4611686616072338493&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '94笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '华为/HUAWEI MateBook D 14 Windows版 英特尔10代 i7+16GB+512GB SSD 独显 笔记本电脑', 'price': '?6199.00', 'detail': '//detail.tmall.com/item.htm?id=610156068400&skuId=4466875367173&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '632笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【现货版速发】华为matepad 10.8英寸平板电脑二合一2020新款pro
全网通话m6大屏pad学习学生12寸办公游戏iPad', 'price': '?3399.00', 'detail': '//detail.tmall.com/item.htm?id=624249102569&skuId=4626490291781&user_id=3461286402&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '蓝阳数码专营店', 'sales': '2471笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【顺丰速发】华为平板MatePad平板电脑10.4英寸2020新款Pro教育全
面大屏M6全网通话10寸Huawei手机二合一ipad', 'price': '?1899.01', 'detail': '//detail.tmall.com/item.htm?id=617111511833&skuId=4611686635538899737&user_id=3394933058&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为华亲专卖店', 'sales': '1488笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【官方正品】华为/HUAWEI MatePad Pro 5G 麒麟990 绚丽全面屏平
板电脑智能学习游戏一体机', 'price': '?5299.00', 'detail': '//detail.tmall.com/item.htm?id=618290735512&skuId=4364946048927&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1128笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': '【畅销爆款】HUAWEI/华为nova 5 Pro 8+128GB 麒麟980新品4800万AI四摄超级快充屏内指纹NFC手机', 'price': '?2199.00', 'detail': '//detail.tmall.com/item.htm?id=596822551576&skuId=4465987566936&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '2317笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为畅享20 Pro 5GSoC芯片华为畅享20pro5g手机智能手机华
为手机华为官方旗舰店', 'price': '?1999.00', 'detail': '//detail.tmall.com/item.htm?id=620350072768&skuId=4556789582028&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '6934笔'}
{'image': 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'name': 'Huawei/华为 华为平板 M6 10.8英寸平板电脑四声道 一屏两用学习
娱乐智能平板电脑', 'price': '?2699.00', 'detail': '//detail.tmall.com/item.htm?id=596577969318&skuId=4149991176279&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '789笔'}
1.6改进,存储在CSV文件内并分行存储
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'
def index_page(page):
url='https://list.tmall.com/search_product.htm?q='
brower.get(url)
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mq')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.mallSearch-input > button:nth-child(3)')))
input.clear()
input.send_keys(keyword)
submit.click()
return get_products(brower)
def get_products(brower):
html=brower.page_source
doc=pq(html)
items=doc('div .product').items()
for item in items:
information=[]
image=item.find('div div a img').attr('src')
information.append(str(image))
name=item.find('.productTitle a').text()
information.append(str(name))
price=item.find('.productPrice em').text()
information.append(str(price))
detail=item.find('div div a').attr('href')
information.append(str(detail))
shop=item.find('.productShop a').text()
information.append(str(shop))
sales=item.find('.productStatus span em').text()
information.append(str(sales))
print(information)
saveinformation(information)
def saveinformation(infors):
with open('data1.csv','a+',newline='',encoding='utf-8') as f:
writer=csv.writer(f)
writer.writerow(infors)
if __name__=='__main__':
index_page(1)
我们在代码中取消字典存储,选择使用列表存储。这样在CSV文件中可以分开存取数据,使用’a+'不覆盖已经读取内容,在打开文件中添加newline减少多余换行.
结果展示:
?
2.读取多页商品信息
?
选择下一页商品信息有两种方法,1.点击下一页,2.输入想要跳转的页面,点击确认。本文使用第二种方法。
对上面代码进行修改,使send_keys只传递page。
2.1部分问题
跳转下一页时,可能中间需要输入账号,代码设置等待时间20秒,输入完账号密码就可以继续爬取页面信息。
使用for循环逐步跳转其他页面。
2.2代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
from urllib.parse import urlencode
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import csv,json
brower=webdriver.Firefox()
wait=WebDriverWait(brower,20)
keyword='huawei'
def index_page(pages):
url='https://list.tmall.com/search_product.htm?q='+quote(keyword)
brower.get(url)
for page in range(1,pages+1):
print('正在爬取第'+str(page)+'页')
if page>1:
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.ui-page-skipTo')))
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'button.ui-btn-s')))
input.clear()
input.send_keys(page)
brower.implicitly_wait(10)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'.ui-page-num'),str(page)))
get_products()
def get_products():
html=brower.page_source
doc=pq(html)
items=doc('div .product').items()
for item in items:
information=[]
image=item.find('div div a img').attr('src')
information.append(str(image))
name=item.find('.productTitle a').text()
information.append(str(name))
price=item.find('.productPrice em').text()
information.append(str(price))
detail=item.find('div div a').attr('href')
information.append(str(detail))
shop=item.find('.productShop a').text()
information.append(str(shop))
sales=item.find('.productStatus span em').text()
information.append(str(sales))
print(information)
saveinformation(information)
def saveinformation(infors):
with open('data2.csv','a+',newline='',encoding='utf-8') as f:
writer=csv.writer(f)
writer.writerow(infors)
if __name__=='__main__':
page=3
index_page(page)
2.3结果展示
一页商品80个,三页一共240个
?