Crossin的编程教室

标题: 一个用python写的用命令行看糗百的小工具 [打印本页]

作者: byron    时间: 2013-9-8 23:20
标题: 一个用python写的用命令行看糗百的小工具
本帖最后由 byron 于 2017-9-6 19:02 编辑

  最近正在学习正则表达式,抛弃了bs4,写了一个用命令行看糗百的小爬虫(爬了糗百最近7天最热门的糗事儿),还算是比较好用的,经过了精心的排版,阅读起来轻松无压力,代码开源在这里,大家相互学习。
  1. #!/usr/bin/python
  2. #coding:utf-8
  3. #作者:Byron
  4. #博客:http://jiabin.tk

  5. import urllib2
  6. import re

  7. #定义程序主函数
  8. def qiubai(page):
  9.     url = "http://www.qiushibaike.com/week/page/%d" % page
  10.     re_qb = re.compile(r'detail.*?<a.*?>(.*?)<.*?title="(.*?)">\s*(.*?)\s*?<',re.DOTALL)
  11.     html = urllib2.urlopen(url).read()
  12.     my_qiubai = re_qb.findall(html)
  13.     n = len(my_qiubai)
  14.     for i in range(n):
  15.         for k in range(3):
  16.             print my_qiubai[i][k]
  17.         s = raw_input("回车继续")
  18.         if s == "q":
  19.             exit()
  20.         print "-"*40

  21. #定义程序循环体
  22. def for_qb():
  23.     for page in range(int(p),280):
  24.         print "-"*18 + "第" + str(page) + "页" + "-"*18
  25.         qiubai(page)

  26. #该部分代码的目是为了设计的严谨,尽可能的使程序不发生崩溃
  27. def if_qb():
  28.     global p
  29.     p = raw_input("输入要看的页数1~280:")
  30.     if p == "q":
  31.         exit()
  32.     elif not p.isdigit() or p =="0" or int(p) > 280:
  33.         if_qb()
  34.     else:
  35.         for_qb()
  36. print "-"*40
  37. print "糗百命令行版——Byron"
  38. print "一入糗百深似海,从此节操是路人"
  39. print '输入"q"退出程序'
  40. print "-"*40

  41. if_qb()
复制代码
有图有真相:
QQ20130908-1.png
欢迎来blog交流:https://googleyixia.com/2013/09/08/qiubai-regex/
作者: Miracle_Wong    时间: 2013-9-8 23:33
楼主霸气,学习ing
作者: byron    时间: 2013-9-8 23:37
Miracle_Wong 发表于 2013-9-8 23:33
楼主霸气,学习ing

一起学习。
作者: sauce_brother    时间: 2013-9-9 10:40
顶版主!三好学生,没跑了。
作者: 文书    时间: 2013-9-9 10:54
你这抓取的都是纯文字的  如果是图片呢?
作者: Myk_cc    时间: 2013-9-9 11:30
问下楼主 怎么入手学习写爬虫?
作者: dark    时间: 2013-9-9 12:11
Myk_cc 发表于 2013-9-9 11:30
问下楼主 怎么入手学习写爬虫?

大先生的教程有啊。。。
作者: byron    时间: 2013-9-9 12:36
文书 发表于 2013-9-9 10:54
你这抓取的都是纯文字的  如果是图片呢?

命令行看不了图片哇。
抓图片可以抓到,然后下载下来的,你可以参考这个:
http://www.oschina.net/code/snippet_109764_4506
作者: Myk_cc    时间: 2013-9-9 13:29
dark 发表于 2013-9-9 12:11
大先生的教程有啊。。。

就是查天气那个吗?
作者: byron    时间: 2013-9-9 13:42
Myk_cc 发表于 2013-9-9 13:29
就是查天气那个吗?

Crossin过两天应该就会写的。
上月底挖的坑,也该填上了。
哈哈。
作者: byron    时间: 2013-9-9 19:59
fix a bug:
糗百每页的内容有时候会发生变化,程序有时候会range出界。
现在加了一个变量,计算这页有多少条内容,之后再range,就不会出错了。
感谢@HankZhou 的反馈。
作者: byron    时间: 2013-9-9 20:07
fix a bug:
糗百每页的内容有时候会发生变化,程序有时候会range出界。
现在加了一个变量,计算这页有多少条内容,之后再range,就不会出错了。
感谢@HankZhou 的反馈。
作者: crossin先生    时间: 2013-9-13 02:00
byron 发表于 2013-9-9 13:42
Crossin过两天应该就会写的。
上月底挖的坑,也该填上了。
哈哈。

这是在催稿的节奏啊
作者: michael    时间: 2013-10-2 16:39

作者: 羽扇纶巾    时间: 2013-12-2 00:28
LZ好牛,学习了
作者: 文心雕龙    时间: 2014-5-17 21:25
错误,请求太多了?

File "D:\Python27\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 502: Bad Gateway

作者: crossin先生    时间: 2014-5-18 15:08
文心雕龙 发表于 2014-5-17 21:25
错误,请求太多了?

File "D:\Python27\lib\urllib2.py", line 531, in http_error_default

502是服务器错误。所以应该是糗百后台出了问题。
可能等一等就好了。
你可以试试直接浏览器里访问这个url有没有问题。
作者: 文心雕龙    时间: 2014-5-18 15:38
crossin先生 发表于 2014-5-18 15:08
502是服务器错误。所以应该是糗百后台出了问题。
可能等一等就好了。
你可以试试直接浏览器里访问这个url ...

我用的是chrome,URL可以打开,代码里不能,会不会是和浏览器有关?
作者: crossin先生    时间: 2014-5-19 12:53
文心雕龙 发表于 2014-5-18 15:38
我用的是chrome,URL可以打开,代码里不能,会不会是和浏览器有关?

一直不可以?
你在代码里输出url看看,是不是因为笔误或者编码导致url不对了。
如果确认正确,那可能对方服务器做了些判断。那就要在请求的header里加上ua信息,伪装成浏览器
作者: 文心雕龙    时间: 2014-5-19 22:07
crossin先生 发表于 2014-5-19 12:53
一直不可以?
你在代码里输出url看看,是不是因为笔误或者编码导致url不对了。
如果确认正确,那可能对方 ...

Traceback (most recent call last):
  File "E:/python/Python project/python code of IDLE/qiubai.py", line 47, in <module>
    if_qb()
  File "E:/python/Python project/python code of IDLE/qiubai.py", line 40, in if_qb
    for_qb()
  File "E:/python/Python project/python code of IDLE/qiubai.py", line 29, in for_qb
    qiubai(page)
  File "E:/python/Python project/python code of IDLE/qiubai.py", line 13, in qiubai
    html = urllib2.urlopen(url).read()
  File "D:\Python27\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "D:\Python27\lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "D:\Python27\lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "D:\Python27\lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "D:\Python27\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "D:\Python27\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 502: Bad Gateway
作者: Heinrich    时间: 2014-6-3 14:17
楼主点赞 下载下来学习
我在运行时爆了一个HTTPError,详细信息如下:
----------------------------------------
糗百命令行版——Byron
一入糗百深似海,从此节操是路人
输入"q"退出程序
----------------------------------------
输入要看的页数1~280:1
------------------第1页------------------
url is :http://www.qiushibaike.com/week/page/1
Traceback (most recent call last):
  File "qb.py", line 48, in <module>
    if_qb()
  File "qb.py", line 41, in if_qb
    for_qb()
  File "qb.py", line 30, in for_qb
    qiubai(page)
  File "qb.py", line 14, in qiubai
    html = urllib2.urlopen(url).read()
  File "C:\Python27\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "C:\Python27\lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python27\lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "C:\Python27\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 502: Proxy Error ( The specified network name
o longer available.  )
----------------------------------------
其中url是我输出的urlopen的地址,改地址在浏览器可以打开
想问一下是否是我本地上网用的是代理的原因?如果是怎么解决?
如果不是这个原因应该怎么办?


作者: crossin先生    时间: 2014-6-3 15:10
Heinrich 发表于 2014-6-3 14:17
楼主点赞 下载下来学习
我在运行时爆了一个HTTPError,详细信息如下:
----------------------------------- ...

确实似乎是代理的问题。可以把代理关掉吗
作者: Heinrich    时间: 2014-6-3 16:30
本帖最后由 Heinrich 于 2014-6-3 16:31 编辑
crossin先生 发表于 2014-6-3 15:10
确实似乎是代理的问题。可以把代理关掉吗

先生,我现在在单位,公司通过一个代理统一上网,所以去不掉。
然后有了以下探索……
我刚才添加了
try:
        if_qb()
except urllib2.HTTPError as e:
        print e.code
        print e.read()
错误输出中有一句
        <LI id=L_64_12>Error Code 64: Host not available
<LI id=L_64_13>Background: The gateway or proxy server lost connection to the We
b server.
<LI id=L_64_14>Date: 6/3/2014 7:48:05 AM [GMT]
<LI id=L_64_15>Server: XXXXX
<LI id=L_64_16>Source: Remote server
觉得是代理问题, 于是自己写了一小段,只是为了确定代理是不是对所有的网站都不能正确connect
于是有了这段:
------------------------------------------
import re
import urllib2
from bs4 import BeautifulSoup

url = "http://www.douban.com/people/P05004260/"
#url = "http://www.qiushibaike.com/week/page/1"
contents = urllib2.urlopen(url).read()
pattern = re.compile(r'P05004260')
soup = BeautifulSoup(contents)
link_list = []
targethref_list = []

for link in soup.find_all('a'):
        try:
                link_list.append(link.get('href'))        
        except UnicodeEncodeError:
                print '==============^^ UnicodeEncodeError ^^==============='

for number in link_list:
        #print "href is: %s" % number
        #print re.search('P05004260',number)
        m = pattern.search(number)#search is search every words, match is search first words
        if m:
                print "P05004260 found: ", m
                print "href is: ", number
                targethref_list.append(number)
        #else:
                #print "No match"
------------------------------------
当我的url是豆瓣那个(http://www.douban.com/people/P05004260/)时,就没有问题,
当url是楼主糗百的那个(http://www.qiushibaike.com/week/page/1)时,就仍然爆
urllib2.HTTPError: HTTP Error 502: Proxy Error ( The specified network name is n
o longer available.  )
所以我现在不知道是代理还是地址问题了QAQ 浏览器明明可以打开楼主给的地址的
准备晚上回家在家里没有代理的环境下试一下
作者: 411508912    时间: 2016-4-26 21:28
楼主厉害
作者: 小燕smile    时间: 2016-5-9 10:27
不错啊,学习一下;顺便提几点建议:
1.s = raw_input("回车继续"),我觉得其实你输入任何非q字符都可以继续,所以最好判断一下输入的是否为回车;
2.尽量不要使用if_qb这种不是很明确用来做什么用途的名字,不然读起来比较费劲;
3.global p,全局变量能不用就不要用吧,最好将p作为参数代入for_qb()中,或者干脆不要for_qb()这个function,因为全局变量确实不好找……
作者: xqqxjnt1988    时间: 2017-4-24 10:31
crossin先生 发表于 2013-9-13 02:00
这是在催稿的节奏啊

crossin先生,请问你的教程在 哪里啊,抓取网页的爬虫的,请告知,谢谢
作者: crossin先生    时间: 2017-4-25 00:00
xqqxjnt1988 发表于 2017-4-24 10:31
crossin先生,请问你的教程在 哪里啊,抓取网页的爬虫的,请告知,谢谢

http://crossincode.com/course/lesson_list/
先看看里面查天气相关的几课。
论坛上也有对应的帖子,而且里面记录了不少问题
作者: xqqxjnt1988    时间: 2017-4-25 16:18
crossin先生 发表于 2017-4-25 00:00
http://crossincode.com/course/lesson_list/
先看看里面查天气相关的几课。
论坛上也有对应的帖子,而 ...

好的,谢谢,正在看助教老师发的教程,一篇一篇的在看




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5