当前位置:首页 > 黑客技术 > 正文内容

python爬取京东商品信息(京东反爬虫如何解决)

访客3年前 (2022-01-30)黑客技术412

以下是爬取京东商品详情的Python3代码,以excel存放链接的方式批量爬取。excel如下

代码如下

私信小编01即可获取大量Python学习资源

from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import datetime
import calendar
import logging
from logging import handlers
import requests
import os
import time
import pymssql
import openpyxl
import xlrd
import codecs



class EgongYePing:

     options = webdriver.FirefoxOptions
     fp = webdriver.FirefoxProfile
     fp.set_preference("browser.download.folderList"%2c2)  
     fp.set_preference("browser.download.manager.showWhenStarting"%2cFalse)
     fp.set_preference("browser.helperApps.neverAsk.saveToDisk"%2c"application/zip%2capplication/octet-stream")
     global driver 
     driver= webdriver.Firefox(firefox_profile=fp%2coptions=options)
     def Init(self%2curl%2ccode):
                       print(url.strip)
                       driver.get(url.strip)
                       #driver.refresh
                       # 操作浏览器属于异步,在网络出现问题的时候。可能代码先执行。但是请求页面没有应答。所以硬等
                       time.sleep(int(3))
                       html = etree.HTML(driver.page_source) 
                       if driver.title!=None:
                         listImg=html.xpath('//*[contains(@class%2c"spec-list")]//ul//li//img')
                         if len(listImg)==0:
                              pass
                         if len(listImg)>0:
                                            imgSrc=''
                                            for item in range(len(listImg)):    
                                                 imgSrc='https://img14.360buyimg.com/n0/'+listImg[item].attrib["data-url"]
                                                 print('头图下载:'+imgSrc)
                                                 try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(imgSrc%2c headers=Headers%2c stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     if item==0:
                                                          imgUrl+=code + "_主图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     else:
                                                          imgUrl+=code + "_附图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd+'/img/'+  imgUrl %2c 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                                 except Exception as e:
                                                    print("图片禁止访问:"+imgSrc) 
                         listImg=html.xpath('//*[contains(@class%2c"ssd-module")]') 
                         if len(listImg)==0:
                              listImg=html.xpath('//*[contains(@id%2c"J-detail-content")]//div//div//p//img')
                         if len(listImg)==0:
                              listImg=html.xpath('//*[contains(@id%2c"J-detail-content")]//img')
                         if len(listImg)>0:
                               for index in range(len(listImg)):  
                                    detailsHTML=listImg[index].attrib
                                    if 'data-id' in detailsHTML:
                                          try:
                                           details= driver.find_element_by_class_name("animate-"+listImg[index].attrib['data-id']).value_of_css_property('background-image')
                                           details=details.replace('url(' %2c ' ')
                                           details=details.replace(')' %2c ' ')
                                           newDetails=details.replace('"'%2c ' ')
                                           details=newDetails.strip
                                           print("详情图下载:"+details)
                                           try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details%2c headers=Headers%2c stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd+'/img/'+   imgUrl%2c 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                           except Exception as e:
                                                    print("图片禁止访问:"+details) 
                                          except Exception as e:      
                                               print('其他格式的图片不收录');       
                                    if  'src' in detailsHTML:
                                         try:
                                           details= listImg[index].attrib['src']
                                           if 'http' in details:
                                                     pass
                                           else:
                                                     details='https:'+details
                                           print("详情图下载:"+details)
                                           try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details%2c headers=Headers%2c stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd+'/img/'+   imgUrl%2c 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                           except Exception as e:
                                                    print("图片禁止访问:"+details) 
                                         except Exception as e:      
                                               print('其他格式的图片不收录'); 

                       print('结束执行')

         

     @staticmethod
     def readxlsx(inputText):
        filename=inputText
        inwb = openpyxl.load_workbook(filename)  # 读文件
        sheetnames = inwb.get_sheet_names  # 获取读文件中所有的sheet,通过名字的方式
        ws = inwb.get_sheet_by_name(sheetnames[0])  # 获取第一个sheet内容
        # 获取sheet的最大行数和列数
        rows = ws.max_row
        cols = ws.max_column
        for r in range(1%2crows+1):
            for c in range(1%2ccols):
                if ws.cell(r%2cc).value!=None and r!=1 :
                 if 'item.jd.com' in str(ws.cell(r%2cc+1).value) and str(ws.cell(r%2cc+1).value).find('i-item.jd.com')==-1:
                     print('支持:'+str(ws.cell(r%2cc).value)+'|'+str(ws.cell(r%2cc+1).value))
                     EgongYePing.Init(str(ws.cell(r%2cc+1).value)%2cstr(ws.cell(r%2cc).value))
                 else:
                     print('当前格式不支持:'+(str(ws.cell(r%2cc).value)+'|'+str(ws.cell(r%2cc+1).value)))
                     pass
        pass

if __name__ == "__main__":
                 start = EgongYePing
                 start.readxlsx(r'C:\Users\newYear\Desktop\爬图.xlsx')

基本上除了过期的商品无法访问以外。对于京东的三种页面结构都做了处理。能访问到的商品页面。还做了模拟浏览器请求访问和下载。基本不会被反爬虫屏蔽下载。

上面这一段是以火狐模拟器运行

上面这一段是模拟浏览器下载。如果不加上这一段。经常会下载几十张图片后,很长一段时间无法正常下载图片。因为没有请求头被认为是爬虫。

上面这段是京东的商品详情页面,经常会三种?(可能以后会更多的页面结构)

所以做了三段解析。只要没有抓到图片就换一种解析方式。这杨就全了。

京东的图片基本只存/1.jpg。然后域名是
https://img14.360buyimg.com/n0/。所以目前要拼一下。

京东还有个很蛋疼的地方是图片以data-id拼进div的背景元素里。所以取出来的时候要绕一下。还好也解决了。

以下是爬取京东商品详情的Python3代码,以excel存放链接的方式批量爬取。excel如下

因为这次是淘宝和京东一起爬取。所以在一个excel里。代码里区分淘宝和京东的链接。以下是代码

from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import datetime
import calendar
import logging
from logging import handlers
import requests
import os
import time
import pymssql
import openpyxl
import xlrd
import codecs



class EgongYePing:

     options = webdriver.FirefoxOptions
     fp = webdriver.FirefoxProfile
     fp.set_preference("browser.download.folderList"%2c2)  
     fp.set_preference("browser.download.manager.showWhenStarting"%2cFalse)
     fp.set_preference("browser.helperApps.neverAsk.saveToDisk"%2c"application/zip%2capplication/octet-stream")
     global driver 
     driver= webdriver.Firefox(firefox_profile=fp%2coptions=options)
     def Init(self%2curl%2ccode):
                       #driver = webdriver.Chrome('D:\python3\Scripts\chromedriver.exe')
                       #driver.get(url)
                       print(url.strip)
                       driver.get(url.strip)
                       #driver.refresh
                       # 操作浏览器属于异步,在网络出现问题的时候。可能代码先执行。但是请求页面没有应答。所以硬等
                       time.sleep(int(3))
                       html = etree.HTML(driver.page_source) 
                       if driver.title!=None:
                         listImg=html.xpath('//*[contains(@id%2c"J_UlThumb")]//img')
                         if len(listImg)==0:
                              pass
                         if len(listImg)>0:
                                            imgSrc=''
                                            for item in range(len(listImg)):    
                                                 search=listImg[item].attrib
                                                 if 'data-src' in search:
                                                    imgSrc=listImg[item].attrib["data-src"].replace('.jpg_50x50'%2c'')
                                                 else:
                                                    imgSrc=listImg[item].attrib["src"]
                                                 if 'http' in imgSrc:
                                                     pass
                                                 else:
                                                     imgSrc='https:'+imgSrc
                                                 print('头图下载:'+imgSrc)
                                                 try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(imgSrc%2c headers=Headers%2c stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     if item==0:
                                                          imgUrl+=code + "_主图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     else:
                                                          imgUrl+=code + "_附图_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd+'/img/'+  imgUrl %2c 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                                 except Exception as e:
                                                    print("图片禁止访问:"+imgSrc) 
                         listImg=html.xpath('//*[contains(@id%2c"J_DivItemDesc")]//img')
                         if len(listImg)>0:
                               for index in range(len(listImg)):  
                                    detailsHTML=listImg[index].attrib
                                    if 'data-ks-lazyload' in detailsHTML:
                                        details= listImg[index].attrib["data-ks-lazyload"]
                                        print("详情图下载:"+details)
                                    else:
                                        details= listImg[index].attrib["src"]
                                        print("详情图下载:"+details)
                                    try:
                                                  Headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                  r = requests.get(details%2c headers=Headers%2c stream=True)
                                                  if r.status_code == 200:
                                                     imgUrl=''
                                                     details=details.split('?')[0]
                                                     imgUrl+=code + "_详情图_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                     open(os.getcwd+'/img/'+   imgUrl%2c 'wb').write(r.content) # 将内容写入图片
                                                  del r
                                    except Exception as e:
                                                    print("图片禁止访问:"+details)  
                       print('结束执行')

         

     @staticmethod
     def readxlsx(inputText):
        filename=inputText
        inwb = openpyxl.load_workbook(filename)  # 读文件
        sheetnames = inwb.get_sheet_names  # 获取读文件中所有的sheet,通过名字的方式
        ws = inwb.get_sheet_by_name(sheetnames[0])  # 获取第一个sheet内容
        # 获取sheet的最大行数和列数
        rows = ws.max_row
        cols = ws.max_column
        for r in range(1%2crows+1):
            for c in range(1%2ccols):
                if ws.cell(r%2cc).value!=None and r!=1 :
                 if 'item.taobao.com' in str(ws.cell(r%2cc+1).value):
                     print('支持:'+str(ws.cell(r%2cc).value)+'|'+str(ws.cell(r%2cc+1).value))
                     EgongYePing.Init(str(ws.cell(r%2cc+1).value)%2cstr(ws.cell(r%2cc).value))
                 else:
                     print('当前格式不支持:'+(str(ws.cell(r%2cc).value)+'|'+str(ws.cell(r%2cc+1).value)))
                     pass
        pass

if __name__ == "__main__":
                 start = EgongYePing
                 start.readxlsx(r'C:\Users\newYear\Desktop\爬图.xlsx')

淘宝有两个问题,一个是需要绑定账号登录访问。这里是代码断点。然后手动走过授权。

第二个是被休息和懒惰加载。被休息。其实没影响的。一个页面结构已经加载出来了。然后也不会影响访问其他的页面。

至于懒惰加载嘛。对我们也没啥影响。如果不是直接写在src里那就在判断一次取 data-ks-lazyload就出来了。

最后就是爬取的片段截图

建议还是直接将爬取的数据存服务器,数据库,或者图片服务器。因为程序挺靠谱的。一万条数据。爬了26个G的文件。最后上传的时候差点累死了

是真的大。最后还要拆包。十几个2g压缩包一个一个上传。才成功。

扫描二维码推送至手机访问。

版权声明:本文由专业黑客技术知识发布,如需转载请注明出处。

本文链接:https://hkjdpt.com/119119.html

分享给朋友:

“python爬取京东商品信息(京东反爬虫如何解决)” 的相关文章

酒店回应女子房间遭陌生男刷卡「女住客房门凌晨被刷开」

据长城网2021年10月20日02:09:12的最新发布,微博网友@江西旅游广播 爆料。 平安夜来临之际,事件,在网上炒得沸沸扬扬,引发全网热议! 据悉,酒店回应女子房间遭陌生男刷卡后来甚至还有人挖出牵走她的那个男嘉宾。怀疑出门去公司工作。相比也就是学生会和社团那几个出挑的男男女女。...

911万年历黄道吉日(黄历吉日查询)

戊寅,中红色/绿色表示节假日,但不能.8点072009年7月份恭候您二位领证的黄道吉日,男:1978戊午年11月26日2009年9月份恭候您二位结婚登记的万年历黄道吉日是.甲申,避开公休日后可任选。 也可以用七月与正月,7属羊想2016选个日子结婚想.小,很实用,月10日星期四七月廿二壬子,9点25...

有机硅dmc价格行情生意社_棕榈油现货价格 生意社

据生意社数据显示,可能还会随原料丁二烯,减少农药污染。 2014年9月2日,价格为20375元/吨。五味子俗称北五味子,据生意社价格监测,焦炭,除草剂。 我国进口小麦不断刷新纪录。有机硅2011年10月12日.由于受到国际小麦价格较低的推动.点33元/吨,进口小麦数量仍将处于高位,展望2014年,据...

成都奥迪q5带4区,奥迪a5报价

16款奥迪Q5新车指导价:35点85-57,专业化设计、可以看到很多,迈进了大胆的一步。一个是轿跑,一个是S怎么比了,恩。 跑车A5的一款新排量车型2点0TFSI和高性能运动车型S5正式上市,能不能告诉我,Q52016款40TFSI舒适型47点90万奥迪Q52016款40TFSI动感型54点10万奥...

如何查询会考成绩(上海会考成绩单去哪里开)

2021年1月上海市普通高中学业水平考试成绩查询通道今日(2月3日)开通。 成绩查询通道将开通至3月3日16:00。 考生输入本人普通高中学业水平考试准考证上的12位数报名号和密码(报名时所填考生证件号码最后不含字母的6位数字),查询本人在今年1月9日至10日参加的语文、数学、外语合格考科目成绩...

酒店回应女子房间遭陌生男刷卡「女住客房门凌晨被刷开」

据长城网2021年10月20日02:09:12的最新发布,微博网友@江西旅游广播 爆料。 平安夜来临之际,事件,在网上炒得沸沸扬扬,引发全网热议! 据悉,酒店回应女子房间遭陌生男刷卡后来甚至还有人挖出牵走她的那个男嘉宾。怀疑出门去公司工作。相比也就是学生会和社团那几个出挑的男男女女。...

评论列表

拥嬉矫纵
3年前 (2022-06-05)

imgUrl='' imgUrl+=code + "_详情图_" + str(inde

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。