初步学习选择了百度文库资料《网络爬虫-Python和数据分析》,下面就练习遇到的问题做如下总结:
初始代码:
import re
import urllib2
import MySQLdb
from BeautifulSoup import BeautifulSoup
url1="http://bbs.ustc.edu.cn/cgi/bbstdoc?board=PieBridge&start=3558"
fp=urllib2.urlopen(url1)
s=fp.read() #把上操作的结果读出来赋给S
soup=BeautifulSoup(s) #用BeautifulSoup分析S
polist=soup.findAll('span')#找到所有tag<span>的内容
print polist[0].contents[0] #打印出第一个tag<span>中间的内容
问题1:
发现无法“import MySQLdb”,提示“ImportError: No module named MySQLdb”
解决方法,搜索下载MySQL-python-1.2.4.win32-py2.7.exe文件,保存在D:\Python27目录下双击运行,问题解决。
问题2:ImportError: No module named BeautifulSoup
方法:使用命令行,进入到D:\Python27\Scripts地址下,easy_install BeautifulSoup,显示安装成功。在D:\Python27\Lib\site-packages下查看,发现有文件beautifulsoup-3.2.1-py2.7.egg,但是直接写import BeautifulSoup程序通过,在上述代码运行时依然出现“No module named BeautifulSoup”问题。后来把命令行窗口,代码窗口全部关闭,环境变量加上D:\Python27、D:\Python27\Lib\site-packages胡乱试了一通,突然再打开就通过了,通过原理还是一头雾水呀。。。
改进代码1,搜索Pie版全部所有帖子
#目标:爬完PIE版所有帖子。问题:1,太慢,平均每秒一个;2:,有乱码。
import re
import urllib2
import MySQLdb
from BeautifulSoup import BeautifulSoup
aaa=3640
url1="http://bbs.ustc.edu.cn/cgi/bbstdoc?board=PieBridge&start="#赋一个URL
while aaa>0:
aaa=aaa-20 #瀚海星云link有很简单的规律,即每页递减20,利用这个规律设置每次输入的URL,这样就爬完了PIE版所有帖子
aaa1=str(aaa)
url11=url1+aaa1
fp=urllib2.urlopen(url11) #打开此URL
s=fp.read() #把上操作的结果读出来赋给S
soup=BeautifulSoup(s) #用 BeautifulSoup分析s
polist=soup.findAll('span')#找到所有tag<span>的内容
print polist[0].contents[0] #打印出第一个tag<span>中间的内容
改进代码2,消除乱码
import re
import urllib2
import MySQLdb
from BeautifulSoup import BeautifulSoup
aaa=2062
url1="http://bbs.ustc.edu.cn/cgi/bbstdoc?board=PieBridge&start="
while aaa>0:
aaa=aaa-20
aaa1=str(aaa)
url11=url1+aaa1
fp=urllib2.urlopen(url11)
try:
s=fp.read().decode("gb3212","ignore")#把gb2312修改成网页的编码
#在这里添加一行代码,修改网页内容S的编码设置
s=re.sub("charset=gb2312","charst=utf-8",s,re.I)
s=s.encode('utf-8','ignore')
except:
s=fp.read()
soup=BeautifulSoup(s)
polist=soup.findAll('span')
print polist[0].contents[0]
出现问题:Traceback (most recent call last): File "D:/Python27/运行示例暂存/all-PIE2-decode.py", line 22, in <module> print polist[0].contents[0]IndexError: list index out of range——列表索引超出范围!后来上网搜索,一般这种问题要么超了要么列表components[k]只是个空列表时,索引0也会报错。问题代码定位在try语句中,然后发现出现了低端问题,把gb2312写成了gb3212,修改代码:
s=fp.read().decode("gb2312","ignore")#把gb3212修改为gb2312
问题解决。