python爬虫初尝试
前几天在做大作业的时候需要一些数据,然后就没事干研究了一下用python写了个爬虫
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import pycurl
import time
import StringIO
import re
from bs4 import BeautifulSoup
import urllib
def has_ch(str):
zhPattern=re.compile(u'[\u4e00-\u9fa5]+')
return zhPattern.search(str)
def urlencode(str):
reprStr=repr(str).replace(r'\x','%')
return reprStr[1:-1]
obj=open("webtinker","w+")
#reg=r"(?=(<([^<>]*)>[^<>/]*</\1>))"
#reg=r"?=<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>"
lst=[]
def digui(url,num):
global obj,lst
lst.append(url)
if (num>5):
return 0
print "pending "+str(num)+" "+url
b=StringIO.StringIO()
c=pycurl.Curl()
c.setopt(pycurl.MAXREDIRS,5)
c.setopt(c.URL,url)
c.setopt(c.WRITEFUNCTION,b.write)
c.setopt(pycurl.SSL_VERIFYPEER,0)
c.setopt(pycurl.SSL_VERIFYHOST,0)
c.setopt(pycurl.CONNECTTIMEOUT,1)
try:
c.perform()
except pycurl.error,error:
errno, errstr=error
print 'An error occurred: ',errstr
c.close()
else:
html=b.getvalue()
httpcode=c.getinfo(pycurl.HTTP_CODE)
c.close()
b.close()
if (httpcode!=200):
print "error "+url
else:
soup=BeautifulSoup(html,"html.parser")
obj.write(url+"\t"+str(len(soup.find_all("a")))+"\t"+str(len(soup.find_all("div")))+"\t"+str(len(soup.find_all("p")))+"\t"+str(len(soup.find_all("img")))+"\n")
for anchor in soup.find_all("a"):
href=anchor.get("href")
if (href and href[0:1]=="/" and not has_ch(href)):
target="https://www.web-tinker.com"+href
if not target in lst:
digui(target,num+1)
digui("https://www.web-tinker.com/",0)
obj.close()
其实原理非常简单,用curl爬网页,然后用beautifulsoup解析标签,记录下每个页面的a、div、img、p标签数量,对所有符合条件的a标签进行下一级爬取,采用递归的方法控制爬的层数
只是有一个问题,就是一开始当爬取的url含有非ascii字符时都会报错,然后编写的urlencode函数又非常奇怪,所以不得已只爬取了纯英文的url,不知道是怎么回事有没有什么解决方案
2016
06 09
上一篇
Older
下一篇
Newer
评论
0
点击
2480