1.获取请求
#获取一个post请求
import urllib.parse
data = bytes(urllib.parse.urlencode({"hellow":"word"}),encoding = 'utf-8')#用来模拟浏览器
response = urllib.request.urlopen("http://httpbin.org/post",data = data)
print(response.read().decode('utf-8'))
#获取一个get请求
data_ = bytes(urllib.parse.urlencode({"cba":"abc"}),encoding = 'utf-8')#用来模拟浏览器
response_ = urllib.request.urlopen("http://httpbin.org/get",data = data_)
print(response_.read().decode('utf-8'))
"""
以上输出为
{
"args": {},
"data": "",
"files": {},
"form": {
"hellow": "word"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "11",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.6",
"X-Amzn-Trace-Id": "Root=1-61459f65-2b60aa004a46e37f0a92640f"
},
"json": null,
"origin": "58.128.3.221",
"url": "http://httpbin.org/post"
}
可以看到user-agent直接是python,所以很多网站会检测到爬虫然后报418错
如果不加一个字节码的data参数,就会有下面这个405的报错。
2.超时处理
#超时处理
try:
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.5)
print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
print("time out!")
?3.加headers
对于418状态码的报错(被发现我是爬虫了),要把url包装一下,加一个访问头。
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36" ,
}
req = urllib.request.Request(url=baseurl,data=data,headers=headers)
response = urllib.request.urlopen(req)
#print(response.read().decode('utf-8'))
4.写入excel
workbook = xlwt.Workbook(encoding="utf-8")#创建一个对象
worksheet = workbook.add_sheet('岗')#创建工作表
worksheet.write(0,0,'企业')#第0行0列个单元格
worksheet.write(0,1,'职务')
worksheet.write(0,2,'薪酬')
worksheet.write(0,3,'备注')
workbook.save('D:/资源/保存/北京市实习生薪酬调查表111.xls')#保存
#注意每次写入都要保存一下,否则不会存入。
#保存的时候文件不能被打开,否则报错。
#增加新的信息存入的时候,不要创建新的对象,否则原本的信息就丢失了。
5.万能爬法:
url = "https://www.baidu.com/"#这里任意写一个想爬的网站
#先获取html源代码
head = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
req = urllib.request.Request(url,headers=head)
try:
response = urllib.request.urlopen(req)
html = response.read()
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,'reason'):
print(e.reason)
#获取bs对象
bs = BeautifulSoup(html,"html.parser")
#对于绝大多数(甚至所有你想爬的文本)都可以按属性来选择:
money = bs.find_all('span', attrs = {'title' : '薪资'})
for i in money:
worksheet.write(f,2,i.text)#写入excel文件
print(i.text)
f = f + 1
comp = bs.find_all('a', attrs = {'class' : 'company_name under-jobname'})
for i in font:
worksheet.write(f,2,i.text)#写入excel文件
print(i.text)
f = f + 1
#这种方法甚至颜色、字体等等,只要有任何属性,都可以爬。
#注意这个时候,如果这一级标签没有任何属性,但是想爬的文本是上一级属性的所有文本,我们可以直接爬#上一级标签,然后取.text
|