之前写到获取网页信息,这回就把剩下的获取plus价格低于原价5折的商品的代码写完!




首先写一个获取plus价格的方法,把plus价格低于原价5折的商品爬取出来,代码如下:

def get_price(html):
    soup = BeautifulSoup(html, 'lxml')#用beautifulsoup处理反馈回来的网页信息
    # all_page= soup.find_all('div', class_='f-pager')#找到这类商品一共有多少页,方便历遍所有商品
    # page=all_page[0].find('span', class_='fp-text').find('i').text
    li_list = soup.find_all('li', class_='gl-item')#找到所有的商品,以list方式保存
    result_page=[]
    for li in li_list:
        #提取需要内容
        price = li.find('div', class_='p-price').find('i').text#提取每个商品的价格
        plus_price = li.find('div', class_='p-price').find(title="PLUS会员专享价")#提取每个plus价格
        keys=str(plus_price)#因为上面提取的价格为tag格式,需要把他转为字符串格式
        if plus_price==None:#判断此商品是否有plus价格,这个判断方式应该还可以优化
            pass
        else:
            detail_list = []
            price_int = float(price)
            key=re.findall(r"<em>¥(.+)</em>", keys)#使用正则法则提取plus价格
            key_int=float(key[0])
            result=key_int/price_int#算出plus结果打了多少折,如果低于5折则反馈
            if result<0.5:
                code = str(li)
                re_price = r'href="(.*?)"'
                paths = re.findall(re_price, code)
                path="http:"+paths[0]
                name=li.find('div', class_='p-name p-name-type-2').find('em').text#提取每个商品的名字
                detail_list.append(path )
                detail_list.append(price_int)
                detail_list.append(key_int)
                detail_list.append(name)
                result_page.append(detail_list)
                msg=str(path)+"   原价为:"+str(price_int)+"    会员价为:"+str(key_int)+"      "+str(name)
                #detail_lists=map(str,detail_list)#将list里的元素转为str类型
                #msg=''.join(detail_lists)#把list整体转为字符串,已’‘隔开,前提是list里面的元素都是str类型
                window_name = '买京东便野'
                sent_message(msg, window_name)
    return result_page

这个方法需要输入html参数,这个在上一篇文章文章已经介绍了。





因为京东搜索需要关键词,我就把关键词都放到了一个text文本里,这让我可以随时修改,所以这里也要写一个读取text文本内容的方法:

def read_keys(path):#path为text文本的路径
    f=open(path,encoding="utf8")  #将关键词存储到text文本然后读取文本
    data=[each_line.strip('\n') for each_line in f]#读取文本的每一行,并去掉换行符/n
    f.close()
    return data#保存为一个list




爬取到结果后还需要把结果储存到excel表:

def run(path):
    keys = read_keys(path)
    for key in keys:
        print(key)
        try:
            ab = 0
            outlow = xlsxwriter.Workbook(key + '.xlsx')
            tablelow_output = outlow.add_worksheet('plus')
            tablelow_output.write_row(0, 0, ('路径', '原价格', 'plus价格', '名称'))
            for n in range(1, 200):
                # url格式已经考虑了懒加载
                # 其实不用那么麻烦,比如我爬衣服这个数据,只要在后面加&scrolling=y并且page=n就行从一开始s就是搜索商品的数,
                # 比如第一页第一个商品就是1,第二页s就是第一页商品的个数加上1,
                # 我的 爬取的是衣服:url='https://search.jd.com/Search?keyword=衣服&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&stock=1&page='+str(n)+'&s='+str(1+(n-1)*30)+'&click=0&scrolling=y'
                # 这样就可以省略def crow_last(n):
                url = "https://search.jd.com/Search?keyword=" +"自营"+key + "&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&stock=1&page=" + str(n) + "&s=" + str(1 + (n - 1) * 30) + "&click=0&scrolling=y"
                html = get_page(url)
                result_one = get_price(html)
                if result_one == 0:
                    pass
                elif len(result_one) > 0:
                    for i in range(0, len(result_one)):
                        print(result_one[i])

                        tablelow_output.write_row(ab + 1, 0, result_one[i])
                        ab += 1
        except:
            print('报错了!!')

        finally:
            outlow.close()
            if ab==0:
                os.remove(key + '.xlsx')
            else:
                os.rename(key + '.xlsx', key + str(ab) + '.xlsx')






最后就是python的固定运行格式了,我这里用的双线程,有需要的可以修改为4线程或更多的线程,这个看个人的计算机市多少核心:

if __name__ == '__main__':
    delete_excel()
    path1=('keys1.txt')
    path2 = ('keys2.txt')
    p1=Process(target=run,args=("keys1.txt",))
    p2 = Process(target=run, args=("keys2.txt",))
    p1.start()
    p2.start()

。.
.
.
.
.

还有在开始前还得导入用到的库:

from bs4 import BeautifulSoup
import re
import xlsxwriter
import requests
import os
import numba
from multiprocessing import Process
import win32gui
import win32con
import win32clipboard as w

那么python之网络爬虫-爬取京东商品plus价格低于原价5折的商品这个项目就到此结束了。
在此声明,整个项目仅用于学习交流,用于违法事情,本人一律不负责任。如果涉及到版权或者利益,请联系本人删除本贴!