关于在Windows环境下对AliExpress反爬虫技术突破的一些分享

Python爬虫之Aliexpress反爬虫技术的分享

关于在Windows环境下对AliExpress反爬虫技术突破的一些分享

在公司工作的时候公司的业务涉及到了对应爬虫任务,然后根据平时积累的知识写了一写爬虫,本来以为会用selenium会很轻松爬取到数据,但是没想到淘宝里面机制还是太多了,无奈最后优化速度也只能达到在筛选商品后单ip下爬取8000-10000条数据加评论url(不要小看只有8000-10000条,每一条对应有187个字段,并且里面涉及到的业务也有很多,因为是有对应的后台程序,所以格式要求非常严格) 因为这是本人第一次发布文章,有错误或者误导的地方,希望大家多多指出,欢迎大家随时讨论,废话不多说,直接开始思路加代码。

在一开始我进行程序设计的时候单纯只是用了selenium进行爬取,通过修改window.navigator.webdriver的值以及添加头使用user-Agent对selenium进行伪装,从而达到了躲避检测的效果,但是公司对应要求的爬虫只要求要特定类型的商品,所以在添加了条件判断了之后,商品的爬取速度非常感人,这促使了我使用requests加selenium配合爬取对应商品。

思路为:1.使用requests对所有链接进行爬取,然后使用requests找到对应部分商品类别进行判断是否为我们需要的商品,是就保存下来,不是就跳过下一个
2.读取对应保存下来的文件,然后使用selenium一个个进行访问,不知道大家对aliexpress网站的商品有没有了解,商品的详情页都是动态加载,所以需要用selenium进行访问将资源加载出来后进行对应数据的爬取。

1.Python-requests

  1. 相信一般使用python进行爬虫编写的人来说,requests一定是非常熟悉的,requests是python里面的一个第三方模块,用于浏览器url请求对应网址的模块,不了解可以去百度去搜索一下,网上有非常丰富的教程,在这里就不多加介绍了。
  2. 代码部分
import time
import requests, re
#爬取10个指定大区间里面只有Color,Size两个属性的商品
#cookie需要随时修改
cookie = '''ali_apache_id=59.174.142.14.15644497826.380589.2; cna=VIjGFYye6lwCATuujg68LW6e; _bl_uid=k1jdqyIOp9m56v051kjw1dUaU16w; _ga=GA1.2.1981029858.1564449796; _gid=GA1.2.823138832.1564449796; _fbp=fb.1.1564449796007.1051969991; XSRF-TOKEN=da7af879-f263-4790-a4a7-c1b69f2fd560; _mle_tmp0=iiCGajxLJhPRfqiVFROq8uNB0SLCpUbbQTEqjXTD%2FnuW3pLb03SQE2NiCOWL2J3j5V5jLy%2BrzvRcVFZoa0SieADq9HhdKfU5KlsuuVpHYXt80r0AEBJvk9A1usP%2Fxmtw; intl_locale=en_US; n_cap_t=4a3120720050134cbf1fd5a53dfa17717e24a195; aep_common_f=d7qV+a7c/pOcUNRVfb7MsiOj16VAQ2eEX1dldw+mvEV7EyeGrqifkg==; RT="sl=4&ss=1564725893136&tt=0&obo=4&sh=1564726910961%3D4%3A4%3A0%2C1564725934961%3D3%3A3%3A0%2C1564725897779%3D2%3A2%3A0%2C1564725895369%3D1%3A1%3A0&dm=aliexpress.com&si=pglwtkjl7il&rl=1&nu=https%3A%2F%2Fwww.aliexpress.com%2Fitem%2FSexy-Slash-Neck-Mini-Short-Dress-Sleevelee-Slim-Slash-Mini-Party-Dresses-Vestidos-Women-Solid-Fashion%2F32962535171.html%3F2abe27e8a77fbb905bdb1a2051f34108&cl=1564726198868&ld=1564726910962"; _m_h5_tk=9f23d26b27f14fd4eba82f4801b86481_1564732180851; _m_h5_tk_enc=864bfcb4e055efffbbf4a35c9c707243; acs_usuc_t=acs_rt=a05dc7e8f46d4ede82bd55baafc0d968&x_csrf=1dykw221hv1n5; aep_history=keywords%5E%0Akeywords%09%0A%0Aproduct_selloffer%5E%0Aproduct_selloffer%0932961043818%0932913017072%0932964145036%0932865124656%0932502754573%0932962535171%0932975695692%0932975695692; ali_apache_tracktmp=W_signed=Y; _hvn_login=13; xman_us_t=x_lid=cn261242868qcaae&sign=y&x_user=dTIR3UF9fhttrY+PzRwsFTA7OLhiCw2yLQ5h/mribXU=&ctoken=uluiu0k1wzd_&need_popup=y&l_source=aliexpress; aep_usuc_t=ber_l=A0; xman_f=NRdhSfIcjmp1VYdS29KZ8FWCHGXjP2vIYCJv+dXdFpCkCzFA01+C/l1oY8y15IYbf1NJOoeeujecZCF5mce56w9tEZy1cq3qxAs01agfq2gri7jJQ4e2btZ8novhjq+9tLxx5uzn23FY3AyLaMVZXBScRswxaae4S8cBH30cJWGu4mrj/GK3rFoMcrGPZbKBUicGm13xPka9EczaInAioetSH1X67MG8Ig/h1TIWEiR1X1crr1L+1cDGIS59wdPn2FIsJL0p/kb/v2gFmZATuxuVMWatyy4EGzm3Rjt0j91C0TbmGMpZlOnb6Lp+27EMCeAbDJFRwSWkDUzO3kdB0OLJxG1ljiyfGBPQT7KhHHme5IXaCJF9IniunDssfLuJKt2RzZ1rUgCqppAoWdowj2DoY6DPx5UX8BHLMvjsN7md1RXkqPo48FScHmWwPNVfrI4PEFxQGZI=; xman_us_f=zero_order=n&x_locale=en_US&x_l=1&last_popup_time=1564449807470&x_user=CN|CN|shopper|ifm|1860903849&no_popup_today=n; aep_usuc_f=site=glo&c_tp=USD&x_alimid=1860903849&isb=y&region=US&b_locale=en_US; intl_common_forever=juWMwIY0zl97v8cXfSiazLNkTwDmXkNT8X6i6bgmtgRGKukO3eRmKA==; JSESSIONID=6F528B93D90EF68E6340761B0FD2CDF0; l=bBxDIxKmqbZVGvVEBOCNZuI8aM_tDIRAguPRwNqDi_5wx1Y1usbOkSjPwev6Vj5R6rLB4sdB3ey9-etlZ; isg=BMvLGXBsEtGsrU55vrPPb4E7Wm91yN9ppDliSz3I0IpgXOu-xTZtMnq-MhwX_Dfa; ali_apache_track=mt=1|ms=|mid=cn261242868qcaae; xman_t=1/xwfvEC3s+6XzEf6Xlm+9qxnjOHCjqJhkTJOFb2zTHsOprt3BSfUac1+vJjkdu+en73EnW9TBaMeWV0L0QnqKYNIKim756HT/THlaFDc591AJiSFtD44pOMyeuc5fGOWgbbfa5eF/3S1XrTGfYsuaA45tD/FPDfBZGtrG2ntE3xwaoTky9wDJy6IpXSfa/yeURvqhz47QpN0SMoUNh6efqPXAo00ZpPVljZUnjrm3sL0yMAcVoW8M4yhK9QF/ueuEjyZLbRUTYhSD8UPLwsza+YyshPK6ml8lJm1OJiGTCmrlRUuRrGwFTdqLaFBk0jTn+EQV6N5f1Q3mFU2W73db4yxvVNZ0l5IDehPdjd0Z08U7Y31M/coXHuNBLQ8/FuxpHpHg/b8Z5tFXEmRAm1uwqAHSpJOfg0a6NSKfC+bplO3SQs/Pfaqj3Inwv/Nv2YJn7oK0IRGnaUUtzXAd0mJ48NgHx1AEMWWc8KAUMxKQRZVPqnXuVZbcPyHhrgWxiF6wwKMoqtivMRVI0Xlawpj0HsnfrftoUhnRL9p/tWWq/5QzEOkVEZpqHjKwkqlHYdkIf2TfXO3yglj/4bmN/HOwWDbuWixAYcADJmI3DNKgDheELO1DTTRHRfrpNSH4SiEIlhl4RwA+yCRS5axMYJrG6Bjfp/FtcgOvu8UMyNJ4E='''
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
    "Connection": "keep-alive",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    'cookie':cookie
}
price_little_list = [i for i in range(0, 100, 5)]
price_large_list = [i for i in range(5, 105, 5)]
for i in range(0, len(price_large_list)):
    price_large_list[i] = price_large_list[i] - 0.01

def geturl(little_price,large_price):
    global url
    # 分析url,写一个for循环进行拼接url,获取到1-100页url地址,下面的i一定要进行str字符串格式转换。
    # 根据打印结果,对应网页分页数量进行修改i的范围
    for i in range(1,101):
        # 地址里面附带条件
        start_url = "https://www.aliexpress.com/category/200003482/dresses.html?ltype=wholesale&catName=dresses&CatId=200003482&trafficChannel=main&isFreeShip=y&SortType=total_tranpro_desc&minPrice="+str(little_price)+"&maxPrice="+str(large_price)+"&page="+str(i)+"&groupsort=1&switch_new_app=y"
        getdata(start_url,i)
        # 调用这个函数将获取到的url传给getdata函数


def getdata(start_url,num):
    try:
        global headers
        print(start_url)
        cookie1= '''ali_apache_id=59.174.142.14.15644497826.380589.2; cna=VIjGFYye6lwCATuujg68LW6e; _bl_uid=k1jdqyIOp9m56v051kjw1dUaU16w; _ga=GA1.2.1981029858.1564449796; _gid=GA1.2.823138832.1564449796; _fbp=fb.1.1564449796007.1051969991; XSRF-TOKEN=da7af879-f263-4790-a4a7-c1b69f2fd560; _mle_tmp0=iiCGajxLJhPRfqiVFROq8uNB0SLCpUbbQTEqjXTD%2FnuW3pLb03SQE2NiCOWL2J3j5V5jLy%2BrzvRcVFZoa0SieADq9HhdKfU5KlsuuVpHYXt80r0AEBJvk9A1usP%2Fxmtw; intl_locale=en_US; RT="sl=2&ss=1564473598083&tt=10342&obo=0&sh=1564473610905%3D2%3A0%3A10342%2C1564473602998%3D1%3A0%3A4908&dm=aliexpress.com&si=hgzbfjhrgp6&ld=1564473610906&r=https%3A%2F%2Fwww.aliexpress.com%2Fcategory%2F200003482%2Fdresses.html%3Ffc31cbe3cb94930af9ad1bd799e577b8&ul=1564473610908&hd=1564473611182"; n_cap_t=4a3120720050134cbf1fd5a53dfa17717e24a195; _m_h5_tk=9c4709db8e2f9e39276bc98c82dcb588_1564716970239; _m_h5_tk_enc=b339b2b6708363a6f655fded3d7d6c94; aep_common_f=d7qV+a7c/pOcUNRVfb7MsiOj16VAQ2eEX1dldw+mvEV7EyeGrqifkg==; acs_usuc_t=acs_rt=a05dc7e8f46d4ede82bd55baafc0d968&x_csrf=2feti9vecrip; _hvn_login=13; xman_us_t=x_lid=hk346727477pywae&sign=y&x_user=RzmF4B+g0t9+cbib3ke9S9p9NF0YiApZqtPr1PsR4Ps=&ctoken=2rbovhyk_aif&need_popup=y&l_source=aliexpress; aep_usuc_t=ber_l=A2; xman_f=nUP0v3cNihDnyIvkEpfebUdTilWM5Hm2QsGOXTX4Q4B30lOyW4EEWFHr6umFNT4BdxDB1UWJbVg2G9DEpRwRSLmDpDH8CZi/3CLoJAWzsqNLTmEwkGqch8nEESXOlmu1beYddBFhsZtSa2DkcHr5Bhgs3W8Md2Xd9tiBrlyX+NNTo9eVzXi2mPYGloCqixcOlAF6iBPxP4ZcMdlWW/QuqIX/cfNyQKbIb1ifqysRTvSOAaOyuZ+jnd5m/MgAYex1Umgbie/4zdBKcl6UVRxhRLCgP/vfRghEFRmIQayrJfp2OQbH+X1rRG46WvsKXlYRoH6Y1DAiJ13Yjs5YyU4mat92xcj2SZNqJHLj7pGVSx78zum/iNdvZJ6EFd8PLHsnXwidtbqaClUx9kAEHDhVfzgk7ykR72wU3clj29DY7kUdt8IXWffS0kuNnsPSxIl1Y9R9C23mZ/Q=; xman_us_f=zero_order=n&x_locale=en_US&x_l=1&last_popup_time=1564449807470&x_user=HK|HK|shopper|ifm|1944284477&no_popup_today=n; aep_usuc_f=site=glo&c_tp=USD&x_alimid=1944284477&isb=y&region=US&b_locale=en_US; ali_apache_tracktmp=W_signed=Y; x5sec=7b2261652d676c6f64657461696c2d7765623b32223a223433613164333239343862363730353165326339666461343236636364366338434c50456a756f46454d69466d6279663737574948786f4d4d546b304e4449344e4451334e7a7378227d; _gat=1; JSESSIONID=F31D711FE05462B7C2A7E304A88C0495; aep_history=keywords%5E%0Akeywords%09%0A%0Aproduct_selloffer%5E%0Aproduct_selloffer%0932947355862%0932821546888%0932947355862%0932914803238%0932975695692%0932867036156%0932845799756%0932771714771; ali_apache_track=ms=|mt=1|mid=hk346727477pywae; xman_t=6VbFdxzIKLLwVmFqsWFWDd3fprGoqYrxdqdOJH5Rv1TFV6g8uXrPQnuYarMdAlHcacvh+ygah6todvUil+6/wJuZhTTlZG34BAtty6ve4PCjOBEcz09Pur5MeoyAeyHoW3j9yq4BsXZzYcIPOf2XEBlIgDDIHq08fFdqLLd44DN48VGLXaUBrlkSIImS+IWnyF2+JbSUezi6EUHDsaJqo3vgdPSj//H9K4UstuDKDjQexNRVumOEFwuizyxLzfU7uIPuc9vxOo11wLsustReDaSQIOpy+1QhKD//B4A9F6d2Tcoey0BrPyRDCGSrfMVrqPQQ4Eto45of5gjCyX3zcOViAQ3v5KUm/eGlpGTyz3wyIzxSJr3dKaowvOJTNpZYGFh2iElD+gz7xK4dpzFDrPcw8bvRmIFP3zu+YiafSNuDgiNy2ip3ipB/aW0IMN/7nwxruMapEL/WTKe2kwYq1AxbUq9Sr+b6jqJplmJgyRQbm7PRvXNrZsvHqmpGCvDRO3DsW6Dkfll6vtv5HRGfkPnziuEa22IeTDRgULZX+w4ymdTGwjegFDB5SuxWXLJmb49sndmPHh+8o/kKSk5R2utSgq67CkZhnJ/5+86LLH7CGnauIzy/34aKUg5eC/+IyJ3LcAFM5I/wN71cDitLsbVy4oDMHqvZFh4XY+3ngnI=; intl_common_forever=ofwWXBRHI4zK/BUhDSXl4KaKeVyqrT7Parb9hNkBjeEJgcc0K8zBKw==; l=cBxDIxKmqbZVGPkEKOCNquI8aM_9dIRAguPRwNqDi_5QN_TsVE_OkSxkBE96cjWdOFTp4sdB3ey9-etkjKyfIT3doBGR.; isg=BJeXsHA1hq2RtQJdSr_7Q23_JgshdGu1uP0ub-nEkGbNGLda8KgWj90yfvij8EO2'''
        headers1 = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
            "Connection": "keep-alive",
            "Referer": "https://www.aliexpress.com",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            'cookie': cookie1
        }
        Html = requests.get(start_url,headers=headers1)
        Html.encoding = 'utf-8'
        # print(Html.cookies)
        # print(Html.text)
        list1 = re.findall('a class="picRind " href="(.*?)" target=', Html.text)
        if list1==[]:
            list1 = re.findall('productDetailUrl":"(.*?)"',Html.text)
        # print(list1)
        list3 = []
        for i in list1:
            product_url = "https:" + i
            Html = requests.get(product_url, headers=headers)
            time.sleep(1)  # 这个是重点,如果不休眠一秒的话,单ip下极有可能会出现cookie失效,然后触发反爬虫机制
            print(Html.text)
            list2 = re.findall('"skuPropertyName":"(.*?)"', Html.text)
            if list2==[]:
                with open("error_location.txt","a",encoding="utf-8")as a:
                    a.writelines(product_url + "\n")
                    continue
            print(list2)
            if len(list2)==2 and list2[0]=="Color" and list2[1]=="Size":
                list3.append(product_url)
        with open("Dresses_product_url_all.txt","a",encoding="utf-8")as w:
            for i in list3:
                w.writelines(i+"\n")
        # print(list1)
        # print(len(list1))
        # print(start_url)
    except BaseException as B:
        print(B)

if __name__ == '__main__':
    for i in range(0,len(price_little_list)):
        geturl(price_little_list[i],price_large_list[i])



#注意事项: 采集网页的首页的末尾必须为&switch_new_app=y,也就是本代码里面对应的start_url,否则会出现采不到数据的情况。

里面最重要的部分就是关于对应的头的添加以及cookie的获取,暂时笨一点的方法就是手动打开一个aliexpress的页面去复制了之后程序跑起来就可以一直用了,只要你不被cookie清空了并且被暂时禁止爬取就可以。

2.Python selenium部分

我们在第一个部分已经获取到了我们符合初步要求商品的所有url,那么我们现在只需要去爬取对应页面的具体详情详情即可。
因为涉及到公司里面的一些业务和工作内容,就只能写部分的代码,主要是写selenium如何绕过检测进行爬取,相关的里面内容拿多少就看各位大佬个人的喜好了。

  • 代码部分
from selenium import webdriver
import time,os
from bs4 import BeautifulSoup
import lxml, requests, re, csv
import uuid, random

options = webdriver.ChromeOptions()
# options.add_argument('disable-infobars')
# options.add_argument('--headless')
# options.headless = True
attack_spider_num = 0
user_agent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
options.add_argument('--user-agent=%s' % user_agent)
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome('E:\chromedriver.exe', options=options)
#这一步已经做好了对应的driver初始化,接下来我们要往selenium里面写入cookie,首先我们要找到我们对应的aliexpress的登陆页面
去获取它里面对应的cookie,如下:
browser.get("https://login.aliexpress.com/?from=sm&return_url=http://www.aliexpress.com/category/categoryBrowse.vhtml?ltype=wholesale&d=n&isViewCP=y&CatId=200003482&catName=dresses&spm=a2g0o.home.101.3.650c2c25rZRnOM&g=y")
    list1 = browser.get_cookies()
    for i in list1:
        cookie_dict = {
            "domain": ".aliexpress.com",  # 火狐浏览器不用填写,谷歌要需要
            'name': i.get('name'),
            'value': i.get('value'),
            "expires": "",
            'path': '/',
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
        browser.add_cookie(cookie_dict)
    with open("Dresses_product_url_all.txt",'r',encoding='utf-8')as r:
        for i in r.readlines():
            print(i)
            product_information_spider(i,browser)
# Dresses_product_url_al.txt就是我们requests里面爬取到的所有商品链接,product_information_spider就靠各位大佬自己发挥了,
自己想要商品里面的什么信息对应去拿就可以,如果页面里面加载的信息不全,可以使用selenium里面的browser.find_elements_by_Xpath
进行元素定位,然后重新对html进行获取再进行解析就任各位大佬挑选了,至于对应的chorme浏览器驱动版本的话在chrome里面可以查看(网上有大把的资源可以下载,直接百度就可以),如下图介绍:

点击关于Google Chrome
Google对应版本
截止本文章分享为止,小编已经在疯狂爬数据了=w=,希望本文章对大家也有所助益,如果还有什么不懂得,或者写的有错误的,清随时留言给我,我会在看到的第一时间进行回复和大家讨论,并及时修改,本人代码水平能力有限,实现的过程肯定还有更多更好的办法,希望大家能多多提出意见。

本篇文章由Jim_Brown个人独自编写完成,欢迎任何喜欢代码的朋友前来学习、使用以及讨论,任何单位、个人在本作者未授权的前提下不得以
任何理由、方式、手段进行抄袭、修改。转载需注明文章原出处及作者,作者保留对任何侵权行为的一切权利。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值