练手之爬取某电商IPHONE信息

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/12/30 10:51
# @Site    :
# @File    : jd_iphone.py
# @Software: PyCharm

import json
import time
import urllib3
import logging
import requests
from pyquery import PyQuery
from selenium import webdriver

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)#fidder抓包忽略请求warning
headers = {
        "Referer": "https://search.jd.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    }
#控制台日志输出
logging.basicConfig(level=logging.INFO, format=‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
logger_page = logging.getLogger("jd_iphone_page")
logger_detail = logging.getLogger("jd_iphone_detail")

def get_page_detail(maxp):
    product_list = []
    p_no = 0
    for page in range(1,2*maxp,2):
        url = ‘https://search.jd.com/Search?keyword=iphoneapple&page=‘+str(page)+‘&click=0‘#筛选iPhone手机链接
        # resp = requests.get(url,headers=headers,verify=False)
        #浏览器无窗模式
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument(‘--headless‘)
        driver = webdriver.Chrome(chrome_options=chrome_options)
        # driver = webdriver.Chrome()
        driver.get(url)
        driver.implicitly_wait(10)
        #执行js滚动条
        js = ‘‘‘
        timer = setInterval(function(){
           var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
           var ispeed=Math.floor(document.body.scrollHeight / 100);
           if(scrollTop > document.body.scrollHeight * 90 / 100){
               clearInterval(timer);
           }
           console.log(‘scrollTop:‘+scrollTop)
           console.log(‘scrollHeight:‘+document.body.scrollHeight)
           window.scrollTo(0, scrollTop+ispeed)
        }, 20)
        ‘‘‘
        driver.execute_script(js)
        time.sleep(5)
        html = driver.page_source
        doc = PyQuery(html,parser="html")#无参数parser="html"则不能解析,pyquery解析的是html类型的字符串,但是上面的类型是xhtml
        logger_page.info("正在获取%s页数据......"%((page+1)/2))
        for item in doc("#J_goodsList li").items():
            tmp_list = []
            key_list = []#验证关键字,去除不带iphone信息的数据
            #获取价格
            data_sku = item.attr(‘data-sku‘)
            para = ".J_%s"%data_sku
            price = item.find(para).text()
            #获取店铺
            shop = item.find(‘.J_im_icon‘).text()
            #标签
            tag_p = "#J_pro_%s"%data_sku
            tag = item.find(tag_p).text()
            #商品链接
            item = item.find(".gl-i-wrap div a")
            for font in item.find(‘font‘).items():
                key_list.append(font.text())
            href = item.attr(‘href‘)
            #判断是否是苹果手机
            if (u‘苹果‘in key_list) or(u‘iphone‘in key_list) or(u‘Apple‘in key_list) or(u‘apple‘in key_list):
                if "http:" in href:
                    href = href[5:]
                    tmp_list.append(href)
                    tmp_list.append(price)
                    tmp_list.append(shop)
                    tmp_list.append(tag)
                    product_list.append(tmp_list)
                else:
                    tmp_list.append(href)
                    tmp_list.append(price)
                    tmp_list.append(shop)
                    tmp_list.append(tag)
                    product_list.append(tmp_list)
                p_no+=1
                logger_page.info(‘正在获取%s页,第%s个产品信息......‘%(((page+1)/2),p_no))
            else:
                continue
    # print(product_list)
    # print(len(product_list))
    return product_list

def product_detail(list):
    no = 0
    product_info = []
    for link in list:
        url = ‘http:‘+link[0]
        logger_detail.info("正在获取第%s条信息......"%(no+1))
        no+=1
        detail_html = requests.get(url,verify=False)
        doc = PyQuery(detail_html.text,parser="html")

        product_dic = {
            "title":doc(".itemInfo-wrap div.sku-name").text(),
            "jd_price":list[no-1][1],
            "shop":list[no-1][2],
            "tag":list[no-1][3],
            "colour":doc("#choose-attr-1 div.item").text(),
            "ram":doc("#choose-attr-2 div.item").text(),
            "style_buy":doc("#choose-attr-3 div.item").text(),
            # "increment":doc("#summary-support div span").text()
        }
        product_info.append(product_dic)
        # print("第%s条iphone信息:"%(no+1))
        # print(json.dumps(product_dic,encoding=‘UTF-8‘, ensure_ascii=False))
    return product_info
        # print(json.dumps(product_dic,encoding=‘UTF-8‘, ensure_ascii=False))#字典中文输出

if __name__ == ‘__main__‘:
    list = get_page_detail(1)
    # print(json.dumps(list,encoding=‘UTF-8‘, ensure_ascii=False))
    reasult = product_detail(list)
    print (json.dumps(reasult,encoding=‘UTF-8‘, ensure_ascii=False))

原文地址:https://www.cnblogs.com/East-fence/p/12129371.html

时间: 2024-08-27 23:44:22

练手之爬取某电商IPHONE信息的相关文章

爬虫练手,爬取新浪双色彩,信息并进行分析

爬虫练手,爬取新浪双色彩,信息并进行分析 import requests from lxml.html import etree url = 'http://zst.aicai.com/ssq/betOrder/' response = requests.get(url) response_html = etree.HTML(response.text) text_path = '/html/body/div[7]/form/div[2]/table/tbody/tr/td/text()' da

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

Python编写网页爬虫爬取oj上的代码信息

OJ升级,代码可能会丢失. 所以要事先备份. 一开始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启发和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 python2.7版本, 试了一下修改到3.0版本, 要做很多包的更替,感觉比较烦,所以索性就在这个2.7版本上完善了. 首先观赏一下原始代码,我给加了一些注释: # -*- coding: cp936 -*- import urllib2 import urllib import re import

Python爬虫入门 | 5 爬取小猪短租租房信息

小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/1.爬取租房标题 按照惯例,先来爬下标题试试水,找到标题,复制xpath.多复制几个房屋的标题 xpath 进行对比: //[@id="page_list"]/ul/li[1]/div[2]/div/a/span//[@id="page_list"]/ul/li[2]/div[2]/div/a

11、 按照提示输入歌手名字,爬取该歌手所有歌曲信息

1 #11 按照提示输入歌手名字,爬取该歌手所有歌曲信息 2 3 import requests 4 from bs4 import BeautifulSoup 5 from urllib.request import quote 6 7 w_name = input('请输入你喜欢的歌手名字: ') 8 w_code = quote(w_name) 9 10 res = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_c

爬虫 爬取天猫商品的封面信息

# 爬取搜索字段的封面信息 ''' q : 搜索的类型 可以识别中文 天猫控制登录字段: sort: 排序 s:起始第几个商品 问题1: 把s删除以后,虽说可以跳过登陆,但是只能访问第一页了,何解? 解决: 多次点击页面后发现,淘宝测试不完全,在点击跳转页面后,将其的url后的参数只保留 q totalPage jumpto 三个字段后,就可以通过修改jumpto字段的值 来跳转到其他的页面 问题2: 解决登陆问题后,发现无法提前知道totalpage的总页数 解决:只要页面有显示,那我们就能拿

web爬虫讲解—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有这条新闻,可以看到源文件里没有这条信息,这种情况爬虫是无法爬取到信息的 那么我们就需要抓包分析了,启动抓包软件和抓包

NodeJS 爬虫爬取LOL英雄联盟的英雄信息,superagent+cheerio+async

1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,ios的afnetworking) (2)cheerio:Nodejs中的html解析库(每个语言基本都有..) (3)async:Nodejs中的同/异步并发函数执行库(这个非常牛,其他语言同类型的不多) 2.爬取内容 多玩的英雄联盟英雄页面,通过解析页面内每个英雄的URL,然后并发请求英雄的详细数据,提取需要的数据得到结果 http://lol.duowan.com/hero

简易Python脚本爬取我爱我家网站信息

最近杭州房价涨得好凶,要不要跟风买房,确实是个头疼的问题,不过做点准备总是没坏处的.前段时间我找了一个我爱我家的中介了解了下情况,他提到我爱我家官网,说上面信息的时效性和准确度都不错,可以时常关注一下.本着程序员的天性,一切可以用脚本偷懒的事情就都不要麻烦自己动手了,于是就写了一个脚本,用于监测我爱我家官网的消息变动,有新的房源信息就发短信给自己. 首先分析一下可行性,爬取网站,取得HTML页面的信息当然是没什么难度的,接下来就是从中整理出有用的信息,然后发短信给自己了. 发送短信的服务,搜索了