今天同学说家里没网,让我给他下点题给他做,瞬间想到爬下hdu,花了一下午,学了点python的爬虫,写的代码好丑啊,不过目前还是达到目的了。

先写爬虫,就是解析网页的事,通过右键查看编码方式,发现hdu是gbk格式的编码,但是好像不能直接爬,要模拟浏览器行为,百度一下,我就知道,网上早有高人告诉了方法,马上用在代码里,但是那个高人好像没说

req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Accept':'text/html;q=0.9,*/*;q=0.8','Accept-Charset':'GBK,utf-8,ISO-8859-1;q=0.7,*;q=0.3','Accept-Encoding':'gzip','Connection':'close','Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host}

这个表示支持gz压缩的网页,我解析一下午,各种报错,都快崩溃,后来发现Accept-Encoding这里接受了一个好像是压缩文件的东西,一百度,果然是。继续百度解压就可以了。

然后今天的成功就出来了,下面这部分代码是爬2600到2800的。

# -*- coding: utf-8 -*-
from StringIO import StringIO
import gzip
import urllib2
import urllib
import codecs
num = 2600
tmpurl = 'http://acm.hdu.edu.cn/showproblem.php?pid='
while num <= 2800:url = tmpurl+str(num)#resp=urllib2.urlopen(url)req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'GBK,utf-8,ISO-8859-1;q=0.7,*;q=0.3',
'Accept-Encoding':'gzip',
'Connection':'close',
'Referer':None #注意如果依然不能抓取的话,这里可以设置抓取网站的host
}req_timeout = 5req = urllib2.Request(url,None,req_header)resp = urllib2.urlopen(req,None,req_timeout)if resp.info().get('Content-Encoding') == 'gzip':buf = StringIO( resp.read())f = gzip.GzipFile(fileobj=buf)html=f.read()else:html=resp.read()html.decode('gbk')#print(html)name = "D:\pythonre\HDU"+str(num)+".html"fo=codecs.open(name, "w", "gbk")txt = unicode("\n", "gbk")fo.write(txt)fo.write(html.decode('gbk'))fo.close()num=num+1

今天又无聊把代码改进了下,现在只要输入抓取的范围就可以自己分配线程数了,500题分一个线程(随手写的,并不知道分多少比较好),目前杭电题号在1000-5614之间,所以抓取范围也不能超过这个。(目前最大的问题是无法解析js)

#! /usr/bin/env python
# -*- coding=utf-8 -*-
# @Author pythontab.com
from StringIO import StringIO
from time import ctime,sleep
import threading
import gzip
import urllib2
import urllib
import codecs
import os
def first(begin,end):num = begintmpurl = 'http://acm.hdu.edu.cn/showproblem.php?pid='while num <= end:if num>=5614:#如果杭电题目增加了,可以把这个改为当前的最大题号,这样就可以抓取后面新加的题了breakurl = tmpurl+str(num)#resp=urllib2.urlopen(url)req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11','Accept':'text/html;q=0.9,*/*;q=0.8','Accept-Charset':'GBK,utf-8,ISO-8859-1;q=0.7,*;q=0.3','Accept-Encoding':'gzip','Connection':'close','Referer':None }req_timeout = 5req = urllib2.Request(url,None,req_header)resp = urllib2.urlopen(req,None,req_timeout)if resp.info().get('Content-Encoding') == 'gzip':buf = StringIO( resp.read())f = gzip.GzipFile(fileobj=buf)html=f.read()else:html=resp.read()html.decode('gbk')#杭电是GBK编码,要是其他网站不是的话可以去看看修改,目前我还不会自适应编码#print(html)name = "D:\pythonre\HDU"+str(num)+".html"#请在此处编辑保存路径fo=codecs.open(name, "w", "gbk")txt = unicode("\n", "gbk")fo.write(txt)fo.write(html.decode('gbk'))fo.close()num=num+1
if not os.path.isdir(r'D:\\pythonre\\'):os.mkdir(r'D:\\pythonre\\')
left=1
while left<1000 or right >5614 or left>right:left = input(u"请输入抓取范围left")right= input(u"请输入抓取范围right")
th =((right - left) + 500) /500 #向上取整,0-499个题为一个线程,500-999为两个
threads = []
i = 1
fin = 0
while i<=th:if i==th:threads.append(threading.Thread(target=first,args=(left,right),))else :threads.append(threading.Thread(target=first,args=(left,left+499),))i+=1left+=500if __name__ == '__main__':for t in threads:t.setDaemon(True)t.start()t.join()print "End!"

python爬hdu网页相关推荐

  1. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

  2. python爬取网页公开数据_如何用Python爬取网页数据

    使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...

  3. 编程python爬取网页数据教程_实例讲解Python爬取网页数据

    一.利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('http://i.f ...

  4. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  5. python爬虫教程:实例讲解Python爬取网页数据

    这篇文章给大家通过实例讲解了Python爬取网页数据的步骤以及操作过程,有兴趣的朋友跟着学习下吧. 一.利用webbrowser.open()打开一个网站: >>> import w ...

  6. 使用Python爬取网页图片

    使用Python爬取网页图片 李晓文 21 天前 近一段时间在学习如何使用Python进行网络爬虫,越来越觉得Python在处理爬虫问题是非常便捷的,那么接下来我就陆陆续续的将自己学习的爬虫知识分享给 ...

  7. Python小姿势 - Python爬取网页数据

    Python爬取网页数据 爬取网页数据是一个比较常见的Python应用场景,有很多第三方库可以帮助我们完成这个任务.这里我们介绍一下urllib库中的一个常用方法:urllib.request.url ...

  8. 如何用 Python 爬取网页制作电子书

    本文来自作者 孙亖 在 GitChat 上分享 「如何用 Python 爬取网页制作电子书」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 0 前言 有人爬取数据分析黄金周旅游景点,有人爬 ...

  9. 利用python爬取网页图片

    学习python爬取网页图片的时候,可以通过这个工具去批量下载你想要的图片 开始正题: 我从尤物网去爬取我喜欢的女神的写真照,我们这里主要用到的就两个模块 re和urllib模块,有的时候可能会用到t ...

最新文章

  1. 删除数据库日志sql语句
  2. 状态机思路在程序设计中的应用
  3. python dict 排序原理_第一章Python数据结构和算法(字典排序)
  4. 找不到匹配的key exchange算法_目标检测--匹配策略
  5. 比较第一与第二个字符串,是否有连续的5个字符相同.sql
  6. ORA-01400: 无法将 NULL 插入 (CHARGE_WQRL.SF_JMQTFY_T.BH)
  7. 如何在Java中修复表达式的非法开头
  8. redis是什么_什么是Redis?为什么我们要用Redis?
  9. iOS逆向之旅(进阶篇) — 重签名APP(一)
  10. 如何修改opencart的模版适合为mycncart系统使用
  11. document.ready和window.onload
  12. Mutt email 程序使用入门 作者:王垠
  13. 设计模式之——观察者模式
  14. 抖音java表白教程_抖音表白代码
  15. 什么是SNP遗传力?
  16. windows各类密码搜集
  17. 浏览器被劫持怎么解决?关于浏览器被劫持主页的处理方法
  18. 数值分析:高斯消元法
  19. 2021-2027年全球与中国滴流咖啡壶行业市场前瞻与投资战略规划分析报告
  20. Smack核心机制浅析

热门文章

  1. Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔
  2. 解决ZooKeeper配置中出现Error contacting service. It is probably not running.
  3. MPLAB常见问题及解决方法
  4. 深圳 IT 男打人后疯狂凡尔赛,还教育民警,这回把 IT 人的脸都丢尽了……
  5. kdevelop 安装
  6. JVM知识点整理2——(类加载)
  7. Unity FACEGOOD Audio2Face 通过音频驱动面部BlendShape
  8. Win11远程桌面连接怎么打开?Win11远程桌面连接的五种方法
  9. 计算机毕业设计JAVA高校体育场馆预约管理系统设计与实现mybatis+源码+调试部署+系统+数据库+lw
  10. HCIA/HCIP使用eNSP模拟STP实验与STP根桥、根端口、指定端口选举方法