大家好,我在尝试批量爬取网页文本内容的时候,出现了返回结果总是空值等各种问题。我将描述我的思路,请各位帮我看看问题出在哪,谢谢大家!
我的操作思路:
①在51job上搜索关键词“审计、python”,得到搜索结果。
②我选取其中五个打开,准备爬取文本“职能类别:文本内容”。
③将爬取得到的文本保存成文件。
这是我的代码:
import codecs
from bs4 import BeautifulSoup
import requests
def extract_text_from_url(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, "lxml")
element = soup.find("p", {"class": "fp"})
if element is not None:
text = element.get_text()
else:
text = "" # 如果找不到元素,则将text设置为空字符串
return text
def save_to_file(text):
with codecs.open('C:\\Users\\admin\\Desktop\\pythonProject1\\result.txt', 'a', encoding='utf-8') as file:
file.write(text + '\n')
urls = [
"https://jobs.51job.com/shanghai/148861241.html?s=sou_sou_soulb&t=0_0&req=2b943e9e859becc6fe73170109835a73×tamp__1258=QqjOY5D5GK3h8DlxGo4%2B21DR76Lr40%3Dw4D&alichlgref=https%3A%2F%2Fwe.51job.com%2F",
"https://jobs.51job.com/shanghai/145793839.html?s=sou_sou_soulb&t=0_0&req=2b943e9e859becc6fe73170109835a73×tamp__1258=n4%2BxRDuCitY4BiDlxGrbD9lFKbIVG7YD&alichlgref=https%3A%2F%2Fwe.51job.com%2F",
"https://jobs.51job.com/chengdu/149238287.html?s=sou_sou_soulb&t=0_0&req=2b943e9e859becc6fe73170109835a73×tamp__1258=iqRx2GDtGQG%3DKGNDQiTdr8wIzxUEx7Kx&alichlgref=https%3A%2F%2Fwe.51job.com%2F",
"https://jobs.51job.com/dalian/148861240.html?s=sou_sou_soulb&t=0_0&req=2b943e9e859becc6fe73170109835a73×tamp__1258=eqmxgDy7DQdiqAKG%3DD%2FFnheGwrSmYPbdq4D&alichlgref=https%3A%2F%2Fwe.51job.com%2F",
"https://jobs.51job.com/suzhou/144412407.html?s=sou_sou_soulb&t=0_0&req=2b943e9e859becc6fe73170109835a73×tamp__1258=YqjODvmD7YGXpqeqgDRhDA23NG8jDUOrD&alichlgref=https%3A%2F%2Fwe.51job.com%2F"
]
for url in urls:
text = extract_text_from_url(url)
save_to_file(text)
但是出现这种结果:
文档中无文本内容。
我尝试找到问题所在,首先查看了响应状态,结果是200,应该不是这个问题。
而后试验了下单独爬取某一页,发现打印结果是空值。
想请问下我的代码是哪些地方出现了问题,麻烦大家啦!
这种网站都有反爬检测的,你打印一下responsedata那儿看看返回的东西是不是你需要的
import abc #利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
with open('filaname') as f:
pass
@abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('硬盘数据的读取方法')
def write(self):
print('硬盘数据的读取方法')
class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('进程数据的读取方法')
def write(self):
print('进程数据的读取方法')
wenbenwenjian=Txt()
yingpanwenjian=Sata()
jinchengwenjian=Process()
#这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()
print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
# 抽象类 : 规范
# 一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
# 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中
# 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
# java :
# java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
# 但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题
# python
# python中没有接口类 :
# python中自带多继承 所以我们直接用class来实现了接口类
# python中支持抽象类 : 一般情况下 单继承 不能实例化
# 且可以实现python代码