Tesco是全球三大零售企业之一,成立于1932年,是英国最大的零售公司之一,也是世界三大零售商之一。可以在它的网站https://www.tesco.com/查询食品、饮料、家居用品、电器、玩具等商品。如果需要定期获取商品信息,可以使用爬虫程序进行采集。但是直接访问链接获取会被网站拒绝响应,因此需要进行如下优化:
1、User-Agent随机设置
因为User-Agent是请求头的一部分,它包含了浏览器的信息,如浏览器类型、版本、操作系统等。如果每次请求都使用相同的User-Agent,那么网站很容易识别出这是一个爬虫程序,从而采取反爬虫措施。通过使用多个User-Agent随机调用的方式,可以避免一个请求头长时间访问。
2、获取重定向URL
在不发送 cookie 的情况下查看 from:htmlrequests.get
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="refresh" content="5; URL='/groceries/hu-HU/shop/alkohol/sor-cider/all?bm-verify=AAQAAAAH_...
可以看到有一个正在将您的浏览器重定向到其中包含的URL http-equiv="refresh"content="...",可以提取 URL 并跟踪重定向。
3、使用爬虫代理IP
代理IP是指通过第三方服务器的IP地址,用来隐藏爬虫服务器真实的IP地址,从而达到匿名访问网站的目的。使用代理IP可以避免被网站封禁IP,从而保证爬虫程序的正常运行。
结合上述的优化策略,提供相应的demo如下:
importrequestsfromscrapyimportSelectorimportrandomimportbase64#亿牛云(动态转发隧道代理)# 爬虫代理加强版 代理服务器proxyHost="www.16yun.cn"proxyPort="31111"# 爬虫代理加强版 代理验证信息proxyUser="16YUN"proxyPass="16IP"proxyMeta="http://%(user)s:%(pass)s@%(host)s:%(port)s"% { "host" : proxyHost, "port" : proxyPort, "user" : proxyUser, "pass" : proxyPass, } # 设置 http和https访问都是用HTTP代理proxies= { "http" : proxyMeta, "https" : proxyMeta, } user_agents= [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'# 添加更多的User-Agent值] headers= { 'User-Agent': random.choice(user_agents), # 随机选择一个User-Agent值 } site='https://bevasarlas.tesco.hu'page_url=site+'/groceries/hu-HU/shop/alkohol/sor-cider/all'html=requests.get(page_url, proxies=proxies, headers=headers) sel=Selector(text=html) # 从`content`属性提取URLhref=sel.xpath('//meta[@http-equiv]/@content').get().split('=', maxsplit=1)[1].strip('\'') # 跟随重定向html=requests.get(url=site+href,proxies=proxies, headers=headers) sel=Selector(text=html) scraped_data=sel.xpath('//li[contains(@class, "product-list--list-item")]') card=scraped_data[0] name=card.xpath('.//span[@class="styled__Text-sc-1xbujuz-1 ldbwMG beans-link__text"]/text()').extract() print(name)