1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. from functools import wraps
  4. import requests
  5. from lxml import html
  6. from selenium import webdriver
  7. from selenium.webdriver.chrome.options import Options
  8. import time
  9. import random
  10.  
  11. first_num = random.randint(55, 62)
  12. third_num = random.randint(0, 3200)
  13. fourth_num = random.randint(0, 140)
  14.  
  15. class FakeChromeUA:
  16. os_type = [
  17. '(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)',
  18. '(Macintosh; Intel Mac OS X 10_12_6)'
  19. ]
  20.  
  21. chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)
  22.  
  23. @classmethod
  24. def get_ua(cls):
  25. return ' '.join(['Mozilla/5.0', random.choice(cls.os_type), 'AppleWebKit/537.36',
  26. '(KHTML, like Gecko)', cls.chrome_version, 'Safari/537.36']
  27. )
  28.  
  29. HEADERS = {
  30. 'User-Agent': FakeChromeUA.get_ua(),
  31. 'Accept-Encoding': 'gzip, deflate, sdch',
  32. 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
  33. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  34. 'Connection': 'keep-alive'
  35. }
  36.  
  37. URL="https://www.taobao.com/"
  38. MAX_RETRY=3 #最大尝试次数
  39. XPATH="//div[@class='cat-title']" #需要检查的xpath
  40. def request(url):
  41. session=requests.Session()
  42. req=session.get(url,headers=HEADERS)
  43. if req.status_code==requests.codes.ok:
  44. req.encoding=req.apparent_encoding
  45. return req.text
  46. return None
  47.  
  48. def getdriver(url):
  49. co=Options()
  50. prefs = {
  51. 'profile.default_content_setting_values': {
  52. 'images': 2
  53. }
  54. }
  55. co.add_experimental_option('prefs', prefs)
  56. co.add_argument('lang=zh_CN.UTF-8')
  57. co.add_argument('--headless')
  58. co.add_argument('--nogpu')
  59. driver=webdriver.Chrome(chrome_options=co)
  60. driver.get(url)
  61. time.sleep(3)
  62. source=driver.page_source
  63. time.sleep(3)
  64. print("关闭chrome浏览器")
  65. driver.close()
  66. return source
  67. def newdecorator(url,retry,check_xpath):
  68. def decorator(func):
  69. @wraps(func)
  70. def log(*args,**kwargs):
  71. global retry
  72. retry=1
  73. try:
  74. while retry<3:
  75. source=request(url)
  76. if source:
  77. print("开启requests模块")
  78. print("=" * 50)
  79. root=html.fromstring(source)
  80. nodelist=root.xpath(check_xpath)
  81. if nodelist:
  82. return func(source)
  83. else:
  84. print("该网站为ajax生成的网页,开始启用chrome模式")
  85. try:
  86. source=getdriver(url)
  87. except:
  88. print("获取内容失败,再次启动谷歌浏览器")
  89. source = getdriver(url)
  90. break
  91. else:
  92. retry+=1
  93. return func(source)
  94. except Exception as e:
  95. print(e.args)
  96. return log
  97. return decorator
  98.  
  99. @newdecorator(url=URL,retry=MAX_RETRY,check_xpath=XPATH)
  100. def getitem(source):
  101. root=html.fromstring(source)
  102. nodes=root.xpath(XPATH)
  103. print("="*50)
  104. print("开始解析网页")
  105. print("=" * 50)
  106. print("获取商品分类")
  107. for item in nodes:
  108. name=item.xpath(".//text()")
  109. print(name[1])
  110. if __name__ == '__main__':
  111. getitem()

  

python访问网站的更多相关文章

  1. python 携带cookie访问网站(python接口测试post)

    最近在使用自己研究性能测试工具的时候想到,使用python向服务器不断发送数据以作为并发测试.大概情况如下: #coding=utf-8 import urllib2 import urllib im ...

  2. Python监控网站运行状况

    利用python便捷的类库,可以方便快速实现对网站运行状况的监控,主要包括对80端口(即网站运行端口),其它tcp服务等端口的监控就可以了解服务器大概的一个运行状况,使用的库主要为urllib2及so ...

  3. 通过cookies跳过验证码登陆页面,直接访问网站的其它URL

    我每次手动访问去NN网的一家酒店,就不需要登陆,一旦我用脚本打开就会让我登陆,而登陆页面又有验证码,不想识别验证码,所以就想:“通过cookies跳过验证码登陆页面,直接访问网站的其它URL”   转 ...

  4. Python Jupyter 网站编辑器

    Python Jupyter 网站编辑器 jupyter 是 python的网站编辑器可以直接在网页内编写python代码并执行,内置是通过ipython来调用的.很方便灵活. 安装 1.安装ipyt ...

  5. Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

    http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 配置环境 了解HTTPS 配置CA证书服务器 新建示例网站并发布在IIS ...

  6. 配置Java SSL 访问网站证书

    最近在开发 Java 访问 Azure ServiceBus 时遇到SSL证书问题,导致JAVA报错,不能正常访问,报错信息如下: javax.net.ssl.SSLException: Connec ...

  7. htaccess文件还可以被用来把访问网站的流量劫持到黑客的网站

    看是否有文件上传操作(POST方法), IPREMOVED--[01/Mar/2013:06:16:48-0600]"POST/uploads/monthly_10_2012/view.ph ...

  8. iptables的conntrack表满了导致访问网站很慢

    iptables的conntrack表满了导致访问网站很慢 转载自:https://my.oschina.net/jean/blog/189935 检查系统conntrack表是否满 现象:突然发现访 ...

  9. js判断是手机还是电脑访问网站

    js判断是手机还是电脑访问网站                               <script type="text/javascript"> <!- ...

随机推荐

  1. octomap建立

    1.安装ros的octomap  ---已完成 2.阅读相关论文,了解其机理,并编写程序实现. 参考网页:https://www.cnblogs.com/gaoxiang12/p/5041142.ht ...

  2. LeetCode 4——两个排序数组中的中位数

    1. 题目 2. 解答 2.1. 方法一 由于两个数组都是排好序的,因此首先可以想到的思路就是利用归并排序把两个数组合并成一个有序的长数组,然后直接取出中位数即可. class Solution: d ...

  3. 在使用easyUI时,js,css样式都加载了 但是图标加载不了

    可能的问题:web.xml 配置了这些 <servlet-mapping> <servlet-name>default</servlet-name> <url ...

  4. 指针C语言

    一.PTA实验作业 题目一:6-7输出月份英文名 1.PTA提交列表 2.设计思路和流程图 这题只需补充子函数,定义指针数组month[12],分别从一月到十二月,再定义一个字符,让它为NULL,当输 ...

  5. lintcode-135-数字组合

    135-数字组合 给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T.C中的数字可以无限制重复被选取. 例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为: [7 ...

  6. STL中的set容器的一点总结2

    http://blog.csdn.net/sunshinewave/article/details/8068326 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像 ...

  7. redis集群如何清理前缀相同的key

    最近经常收到redis集群告警,每天收到50多封邮件,实在不胜其烦,内存不够用,原因是有一些无用的key(约3000万)占用内存(具体不说了).这部分内存不能被释放. 原来的定期清理脚本的逻辑: 打开 ...

  8. java解析XML的方法

    1.DOM 实现方法 xml文件 <?xml version="1.0" encoding="utf-8"?> <Accounts> & ...

  9. post 中文乱码处理 接受的编码--->解码成字节数组(无任何编码形式)----->编码成想要的格式

  10. Spark探索经典数据集MovieLens

    Spark探索经典数据集MovieLens 阅读目录 前言 环境 初步预览 探索用户数据 探索电影数据 探索评级数据 回到顶部 前言 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电 ...