七宝SEO七宝SEO七宝SEO

今日头条爬虫分析以及上线后问题介绍

kp

  今日头条爬虫分析以及上线后问题介绍

  今日头条爬虫分析

  今日头条的用户页数据爬取跟频道页的数据爬取大部分很类似,但稍微有一点不一样,就是用户主页的接口signature有点不一样,需要将当前爬取的用户id和分页时间戳一起作为入参传递进去才能获取到真正的signature,除了这一点差异外其他的都是一样的思路,上代码:

头条搜索蜘蛛

  def fetch_user_articles(self, user, browser):

  honey = json.loads(self.get_js())

  signature = honey['_signature']

  max_behot_time = "0"

  _as = honey['as']

  cp = honey['cp']

  if self.user_page > 0:

  signature = browser.execute_script("return window.TAC.sign(" + user.user_id+max_behot_time + ")")

  headers = {

  'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',

  'Connection': 'keep-alive',

  'authority': 'www.toutiao.com',

  'referer': user.media_url,

  'method': 'GET',

  'path': "/c/user/article/?page_type=1&user_id={}&max_behot_time={}&count=20&as={}&cp={}&_signature={}".format(

  user.user_id, max_behot_time, _as, cp, signature),

  'scheme': 'https'

  }

  self.s.headers.update(headers)

  req_url = "https://www.toutiao.com/c/user/article/?page_type=1&user_id={}&max_behot_time={}&count=20&as={}&cp={}&_signature={}".format(

  user.user_id, max_behot_time, _as, cp, signature)

  req = self.s.get(req_url, proxies=get_proxy_ip())

  # 通过随机数控制请求速度

  time.sleep(random.random() * 2 + 2)

  data = json.loads(req.text)

  max_behot_time = str(data['next'][max_behot_time])

  if data['has_more']:

  self.user_page = self.user_page + 1

  self.parse_user_artcle(data['data'], toutiaoitem.user_id, toutiaoitem.media_url)

  #在休眠2s

  time.sleep(2)

  self.fetch_user_articles(user, browser)

  else:

  self.parse_user_artcle(data['data'], toutiaoitem.user_id, toutiaoitem.media_url)

  toutiaodb.save(self.user_artcile_list)

  def parse_user_artcle(self, items, user_id, url):

  for item in items:

  toutiaoitem = toutiaoitem()

  toutiaoitem.user_id = user_id

  toutiaoitem.source = item['source']

  toutiaoitem.title = item['title']

  toutiaoitem.source_url = 'https:' + item['display_url']

  toutiaoitem.media_url = url

  toutiaoitem.item_id = item['item_id']

  toutiaoitem.abstract = item['abstract']

  toutiaoitem.comments_count = item['comments_count']

  toutiaoitem.behot_time = item['behot_time']

  toutiaoitem.image_url = item['image_url']

  toutiaoitem.image_list = item['image_list']

  toutiaoitem.tag = item['tag']

  toutiaoitem.chinese_tag = item['chinese_tag']

  toutiaoitem.read_count = item['go_detail_count']

  toutiaoitem.article_genre = item['article_genre']

  self.user_artcile_list.append(toutiaoitem)

头条搜索蜘蛛

  今天开始爬取今日头条的第二个入口搜索,搜索有四个tab分别为综合,视频,图集,用户。先来分析一下综合的搜索接口

  https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E7%A4%BE%E5%8C%BA%E6%96%B0%E9%9B%B6%E5%94%AE&autoload=true&count=20&cur_tab=1&from=search_tab

  只需要传递keyword搜索关键字即可,无需进行其他处理,直接解析接口返回数据,该接口返回的数据有点杂数据结构不统一,有文章,用户,微头条,问答,搜索推荐,其他关键字搜索推荐,在做数据解析的时候要针对这集中数据结构分别做处理。老样子直接上代码:

  defget_search_article(self,keyword,offset=0):

  keyword=urllib.request.quote(keyword)

  req_url=”https://www.toutiao.com/search_content/?offset={}&format=json&keyword={}&autoload=true&count=20&cur_tab=1&from=search_tab”.format(offset,keyword)

  headers={

  ’User-Agent’:’Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.36′,

  ’Connection’:’keep-alive’,

  ’authority’:’www.toutiao.com’,

  ’referer’:”https://www.toutiao.com/search/?keyword={}”.format(keyword),

  ’method’:’GET’,

  ’path’:”/search_content/?offset={}&format=json&keyword={}&autoload=true&count=20&cur_tab=1&from=search_tab”.format(offset,keyword),

  ’scheme’:’https’

  }

  self.s.headers.update(headers)

  req=self.s.get(req_url,proxies=get_proxy_ip())

  time.sleep(random.random()*2+3)

  data=json.loads(req.text)

  items=data[‘data’]

  ifdata[‘has_more’]==1:

  self.page=self.page+1

  offset=20*self.page

  self.parse_data(items)

  time.sleep(2)

  self.get_search_article(keyword,offset)

  else:

  self.parse_data(items)

  toutiaodb.save(self.search_item_list)

  defparse_data(self,items):

  foriteminitems:

  try:

  type=item[‘cell_type’]

  except:

  type=0

  iftype==37:#微头条

  pass

  eliftype==50:

  pass

  eliftype==66:

  pass

  eliftype==26:#内容推荐

  pass

  eliftype==20:#搜索推荐

  pass

  eliftype==38:#用户

  pass

  else:

  titem=toutiaoitem()

  titem.user_id=item[‘user_id’]

  try:

  titem.source=item[‘source’]

  except:

  titem.source=item[‘name’]

  titem.title=item[‘title’]

  titem.source_url=item[‘article_url’]

  titem.media_url=item[‘media_url’]

  titem.item_id=item[‘item_id’]

  titem.abstract=item[‘abstract’]

  titem.comments_count=item[‘comments_count’]

  titem.behot_time=item[‘behot_time’]

  titem.image_url=item[‘image_url’]

  titem.image_list=item[‘image_list’]

  titem.tag=item[‘tag’]

  if’play_effective_count’initem:

  titem.article_genre=’vedio’

  titem.read_count=item[‘play_effective_count’]

  else:

  titem.article_genre=’article’

  self.search_item_list.append(titem)

今日头条搜索爬虫抓取

  头条搜索爬虫暴力抓取网站内容导致大量网站不同程度瘫痪

  最近有站长在网上发文吐槽表示,字节跳动为了快速发展搜索业务派出爬虫四处暴力抓取网站内容,部分配置较低的网站已经直接瘫痪,给中小网站主们造成了很大的损失和困扰,严重影响了网站正常的用户访问。

  该站长表示,今年7月份,他突然发现公司的网站经常性打不开,网页加载极其缓慢,有时甚至直接瘫痪。经过一系列排查后,在服务器日志上发现了bytespider爬虫的痕迹。该爬虫抓取的频率每天达几百万次,高则上千万次,服务器带宽负载飙至100%,而且该爬虫在抓取时完全不遵守网站的robots协议。

  该站长顺着该爬虫的IP地址查询,证实,该爬虫就是字节跳动的搜索爬虫。

  并且,在CSDN、V2EX等技术论坛也了解到,从字节跳动开始做搜索之后,其实网络上就一直有站长抱怨头条搜索爬虫抓取过于暴力的声音,遭受字节跳动的搜索爬虫暴力抓取的不是个例,很多小网站他们也没放过。

  有小网站主抱怨表示:字节跳动的爬虫“一上午对网站发出46万次请求”,网站都瘫痪了,百度也没有这么折腾的!

  最后,该站长表示,像我们这样做SEO的人来说,主要工作目标就是希望自己家网站能在主流搜索引擎的搜索结果中排在前面的位置,“对于像百度、搜狗、360等搜索引擎的规范抓取和收录各位站长都是非常欢迎的,但是头条搜索爬虫这样疯狂爬取内容网站都给整瘫痪了,不仅没给网站带来流量,还影响了正常的用户访问,这就很不“讲究”了。

  但是对此,字节跳动的回应则是,“网络报道不实,目前头条搜索设有反馈机制,网站因为爬虫受到影响,可以直接通过邮件反馈处理。”明是不准备正面回应的。

  所以通过头条搜索爬虫暴力抓取网站内容来看,字节跳动入局全网搜索搅动搜素市场是好事,但是为了快速崛起让自己家爬虫四处暴力抓取,就有问题了,大网站服务器配置高,技术人员多还好【或是在一些大型IDC服务商购买的主机都还好,一些香港海外主机用户可能就有点惨了】,很多小网站原本就是使用海外或香港低端主机也没有什么技术人员维护机房根本就顶不住字节跳动的搜索爬虫这么折腾。

  搜索引擎的索引数据是靠点滴积累起来的,百度、搜狗.360经历了那么多年的发展积累才走到今天,头条搜索想要靠疯狂爬取内容,“一口吃个胖子”,只会让站长们排斥!

  以上就是德州SEO对今日头条爬虫分析以及上线后问题介绍,希望可以帮到你!


未经允许不得转载:七宝SEO » 今日头条爬虫分析以及上线后问题介绍