文章目录
很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:961562169
1.只读取第一页 1.1准备工作1.2.定位1.3.获取商品信息1.4. 整体代码1.5.输出结果展示1.6改进,存储在CSV文件内并分行存储2.读取多页商品信息 2.1部分问题2.2代码2.3结果展示
在学习本节时,发现在淘宝页面搜索需要登录账号密码,因此就选择天猫网页进行爬取,但是只能爬取第一页,之后的页面也要登录账号。(京东页面搜索下一页不要登录账号,有时间做一个爬取京东页面商品信息)
1.只读取第一页
1.1准备工作
天猫搜索页面的URL,以及关键字
/search_product.htm?q=
q后面就是我们需要搜索的商品名称,可以使用quote函数输入keyword,也可以使用send_keys传入到输入框,本文使用第二种方法.
url='/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 webdriverfrom mon.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse import quotefrom urllib.parse import urlencodefrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport csv,jsonbrower=webdriver.Firefox()wait=WebDriverWait(brower,20)keyword='huawei'def index_page(page):url='/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_sourcedoc=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 productdef 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': '///bao/uploaded/i2/2838892713/O1CN01KmhxMx1Vub9Om1ix8_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 Pro|5G SoC芯片超感知徕卡四摄华为p40pro 5g华为手机华为官方旗舰店', 'price': '¥6488.00', 'detail': '///item.htm?id=613832405367&skuId=4501042263809&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '1.7万笔'}{'image': '///bao/uploaded/i3/2616970884/O1CN01E4dXaU1IOukPBOKrb_!!2616970884.jpg', 'name': '【9.25号享12期免息】华为/HUAWEI P40Pro|5G SoC芯片手机徕卡四摄50倍变焦曲面屏官方旗舰店正品华为p40pro', 'price': '¥6488.00', 'detail': '///item.htm?id=614820399492&skuId=4326362936208&user_id=2616970884&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '苏宁易购官方旗舰店', 'sales': '4599笔'}{'image': '///bao/uploaded/i1/2838892713/O1CN01ASqM6R1Vub9Lua8E8_!!2838892713.jpg', 'name': '华为/HUAWEI MateBook D14Windows版 英特尔10代 i5+8GB/16GB+512GB SSD 独显 笔记本电脑', 'price': '¥4999.00', 'detail': '///item.htm?id=610840455173&skuId=4463626930382&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '4069笔'}{'image': '///bao/uploaded/i2/2838892713/O1CN01TjohBN1Vub9MbcSCc_!!2838892713.jpg', 'name': '【限时享12期免息】华为/HUAWEI P40 | 5GSoC芯片超感知徕卡三摄华为p40 5g智能手机华为手机华为官方旗舰店', 'price': '¥4488.00', 'detail': '///item.htm?id=613832301513&skuId=4497703782091&user_id=2838892713&cat_id=2&is_b=1&rn=1b4543038042621f359957a157a731bb', 'shop': '华为官方旗舰店', 'sales': '2.0万笔'}{'image': '///bao/uploaded/i1/2838892713/O1CN01ltNfaA1Vub9Rrkxd3_!!2838892713.jpg', 'name': '【限时享12期免息+200优惠券】Huawei/华为Mate30 Pro5G芯片四摄mate30pro 5g手机华为手机华为官方旗舰店', 'price': '¥6399.00', 'detail': '///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': '///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 款英特尔十代i7+16GB+512GB SSD+MX350 独显触控屏笔记本电脑', 'price': '¥7399.00', 'detail': '///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': '///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': '///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英寸平板电脑二合一新款pro全网通话m6大屏pad学习学生12寸办公游戏iPad', 'price': '¥3399.00', 'detail': '///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英寸新款Pro教育全面大屏M6全网通话10寸Huawei手机二合一ipad', 'price': '¥1899.01', 'detail': '///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': '///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': '///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': '///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': '///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 webdriverfrom mon.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse import quotefrom urllib.parse import urlencodefrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport csv,jsonbrower=webdriver.Firefox()wait=WebDriverWait(brower,20)keyword='huawei'def index_page(page):url='/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_sourcedoc=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 webdriverfrom mon.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse import quotefrom urllib.parse import urlencodefrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport csv,jsonbrower=webdriver.Firefox()wait=WebDriverWait(brower,20)keyword='huawei'def index_page(pages):url='/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_sourcedoc=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=3index_page(page)
2.3结果展示
一页商品80个,三页一共240个
如果觉得《Python爬虫使用selenium爬取天猫商品信息》对你有帮助,请点赞、收藏,并留下你的观点哦!