python爬虫案例——根据网址爬取中文网站,获取标题、子连接、子连接数目、连接描述、中文分词列表

全栈工程师开发手册 (作者:栾鹏)

python教程全解

其中使用到了urllib、BeautifulSoup爬虫和结巴中文分词的相关知识。

调试环境python3.6

# 根据连接爬取中文网站,获取标题、子连接、子连接数目、连接描述、中文分词列表,
import urllib
from bs4 import BeautifulSoup
import bs4

import jieba   #对中文进行分词

# 分词时忽略下列词
ignorewords=[',','。','?','“','”','!',';',':','\n','、','-',',','.','?','\r\n','_',' ']

# 定义爬虫类。获取链接的题目、描述、分词、深度
class crawler:
    def __init__(self,url):
        self.url = url
        self.urls={}
        self.urls[url]={
            'num':1,             #连接被引用的次数
            'title':'',         #连接的标题
            'text':'',          #连接的描述
            'allword':[],       #连接的所有分词列表
        }


    def getword(self,soup):
        # 获取每个单词
        text=self.gettextonly(soup)   #提取所有显示出来的文本
        words=self.separatewords(text)  #使用分词器进行分词
        allword=[]
        for word in words:
            if word not in ignorewords:
                allword.append(word)
        # print(allword)
        return allword

    # 根据一个网页源代码提取文字(不带标签的)。由外至内获取文本元素。style和script内不要
    def gettextonly(self,soup):
        v=soup.string
        if v==None:
            c=soup.contents   # 直接子节点的列表,将<tag>所有儿子节点存入列表
            resulttext=''
            for t in c:
                if t.name=='style' or t.name=='script':   #当元素为style和script和None时不获取内容
                    continue
                subtext=self.gettextonly(t)
                resulttext+=subtext+'\n'
            return resulttext
        else:
            if isinstance(v,bs4.element.Comment):   #代码中的注释不获取
                return ''
            return v.strip()

    # 利用正则表达式提取单词(不能区分中文)。会将任何非字母非数字字符看做分隔符
    def separatewords(self,text):
        seg_list = jieba.cut(text, cut_all=False)  #使用结巴进行中文分词
        return seg_list
        # splitter=re.compile('\\W*')
        # return [s.lower() for s in splitter.split(text) if s!='']

    #爬虫主函数
    def crawl(self):
        try:
            response=urllib.request.urlopen(self.url)
        except:
            print("Could not open %s" % self.url)
            return
        try:
            text = str(response.read(),encoding='utf-8')
            soup=BeautifulSoup(text,'html.parser')
            title = soup.title
            self.urls[self.url]['title'] = title.get_text()  # 将标题加入到属性中


            links=soup('a')
            for link in links:

                if ('href' in dict(link.attrs)):
                    newurl=urllib.parse.urljoin(self.url,link['href'])
                    if newurl.find("'")!=-1: continue
                    newurl=newurl.split('#')[0]  # 去掉位置部分
                    if newurl[0:4]=='http':
                        if newurl not in self.urls:
                            linkText = self.gettextonly(link)  #获取连接的描述
                            self.urls[newurl]={
                                'num':1,   #连接被引用的次数
                                'text':linkText   #链接描述
                            }
                        else:
                            self.urls[newurl]['num']+=1   #连接数+1,这里有算法只算一次
            allword = self.getword(soup.body)  # 获取分词
            self.urls[self.url]['allword'] = allword  # 将分词加入到属性中
        except:
            print("Could not parse page %s" % self.url)



if __name__ == '__main__':
    url='http://blog.csdn.net/luanpeng825485697/article/details/78378653'
    mycrawler = crawler(url)
    mycrawler.crawl()
    print(mycrawler.urls[url]['allword'])





  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用selenium和BeautifulSoup4库来爬取网页标题网址的示例代码: ```python from selenium import webdriver from bs4 import BeautifulSoup # 设置 Chrome 浏览器的位置 chrome_driver_path = "/path/to/chromedriver" # 创建一个浏览器实例 driver = webdriver.Chrome(chrome_driver_path) # 导航到目标网页 driver.get("https://www.example.com") # 使用 BeautifulSoup 将页面源代码解析为 HTML soup = BeautifulSoup(driver.page_source, "html.parser") # 获取页面上的所有链接 links = soup.find_all("a") # 遍历链接列表 for link in links: # 获取链接的 URL url = link.get("href") # 如果链接为空或者已经包含 "http",则跳过这个链接 if not url or "http" in url: continue # 在链接前面添加目标网站的域名,形成完整的 URL url = "https://www.example.com" + url # 导航到链接地址 driver.get(url) # 使用 BeautifulSoup 解析页面的源代码 sub_soup = BeautifulSoup(driver.page_source, "html.parser") # 获取页面的标题 title = sub_soup.title.string # 输出页面的标题和链接 print(title, url) # 关闭浏览器实例 driver.quit() ``` 此示例中,我们首先使用 `webdriver.Chrome` 方法创建了一个 Chrome 浏览器实例,然后导航到目标网页。接着,我们使用 BeautifulSoup4 解析了页面源代码,并获取了页面上的所有链接。然后,我们遍历所有链接,并使用 `driver.get` 方法导航到每个链接所对应的网页。在每个页面上,我们使用 BeautifulSoup4 获取页面的标题,并输出页面的标题和链接。最后,我们使用 `driver.quit` 方法关闭了浏览器实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾讯数据架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值